DJANGO

时间:2019-06-12
本文章向大家介绍DJANGO,主要包括DJANGO使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Django

day51 http协议和django

1.今日内容

1.web框架的本质

2.django的下载安装使用

2.内容回顾

python基础

面向对象 类 属性 方法

网络编程 socket

通信      tcp/ip五层模型

    socket 套接字 位于应用层和传输层之间的虚拟层  一组接口

并发编程 进程 线程 协程【多任务】

数据库 存储数据

前端

1.tcp/ip五层模型

应用层

传输层

网络层

数据链路层

物理层

socket

套接字 位于应用层和传输层之间的虚拟层 一组接口

c/s ——》 b/s

百度的服务器 socket服务端

  1. 创建socket服务端
  2. 绑定IP和端口
  3. 监听
  4. 等待链接
  5. 接收数据
  6. 返回数据
  7. 断开链接

浏览器 socket客户端

  1. 链接服务端
  2. 发送数据
  3. 接收数据
  4. 断开链接

HTTP协议

请求和应答 应用层协议

HTTP协议对收发消息的格式要求
每个HTTP请求和响应都遵循相同的格式,一个HTTP包含Header和Body两部分,其中Body是可选的。
HTTP响应的Header中有一个 Content-Type表明响应的内容格式。它的值如text/html; charset=utf-8。
text/html则表示是网页,charset=utf-8则表示编码为utf-8。

状态码

1xx

2xx

3xx 重定向

4xx 请求的错误

​ 401

5xx 服务器的错误

请求方式 8种

get ——》 获取一个页面、图片(资源)

post ——》 提交数据

url

http://www.cnblogs.com/maple-shaw/articles/9060408.html

协议 域名和端口 HTTP(80) HTTPS(443) 路径 参数

请求(request)

浏览器 —— 》 服务器

GET 请求没有请求数据

“请求方式 url路径 协议版本\r\n

k1:v1\r\n

k2:v2\r\n

\r\n

数据”

响应(response)

服务器 —— 》 浏览器

“协议版本 状态码 状态码描述\r\n

k1:v1\r\n

k2:v2\r\n

\r\n

响应数据(响应体)”

web框架的功能

1.socket收发消息 - wsgiref uwsgi

2.根据不同的路径返回不同的内容

3.返回动态页面(字符串的替换) —— jinja2

django

2 3

flask

2

tornado

1 2 3

web框架

自定义web框架

经过上面的学习,那我们基于socket服务端的十几行代码写一个我们自己的web框架。我们先不处理浏览器发送的请求,先让浏览器能显示我们web框架返回的信息,那我们就要按照HTTP协议的格式来发送响应。

import socket    
    
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    
sock.bind(('127.0.0.1', 8000))    
sock.listen()    
    
while True:    
    conn, addr = sock.accept()    
    data = conn.recv(8096)    
    # 给回复的消息加上响应状态行    
    conn.send(b"HTTP/1.1 200 OK\r\n\r\n")    
    conn.send(b"OK")    
    conn.close()  
    
    我们通过十几行代码简单地演示了web 框架的本质。

接下来就让我们继续完善我们的自定义web框架吧!

1.根据不同的路径返回不同的内容

这样就结束了吗? 如何让我们的Web服务根据用户请求的URL不同而返回不同的内容呢?

小事一桩,我们可以从请求相关数据里面拿到请求URL的路径,然后拿路径做一个判断...

2.根据不同的路径返回不同的内容--函数版

上面的代码解决了不同URL路径返回不同内容的需求。

我们返回的内容是简单的几个字符,那如果我可以将返回的结果封装成一个函数呢?

3.根据不同的路径返回不同的内容--函数进阶版

看起来上面的代码写了一个函数,那肯定可以写多个函数,不同的路径对应执行不同的函数拿到结果,但是我们要一个个判断路径,是不是很麻烦?我们有简单的办法来解决。

4.返回具体的HTML文件

完美解决了不同URL返回不同内容的问题。 但是我不想仅仅返回几个字符串,我想给浏览器返回完整的HTML内容,这又该怎么办呢?

没问题,不管是什么内容,最后都是转换成字节数据发送出去的。 我们可以打开HTML文件,读取出它内部的二进制数据,然后再发送给浏览器。

5.让网页动态起来

网页能够显示出来了,但是都是静态的啊。页面的内容都不会变化的,我想要的是动态网站。

没问题,我也有办法解决。我选择使用字符串替换来实现这个需求。(这里使用时间戳来模拟动态的数据)

WSGI

对于真实开发中的python web程序来说,一般会分为两部分:服务器程序和应用程序。

服务器程序负责对socket服务端进行封装,并在请求到来时,对请求的各种数据进行整理。

应用程序则负责具体的逻辑处理。为了方便应用程序的开发,就出现了众多的Web框架,例如:Django、Flask、web.py 等。不同的框架有不同的开发方式,但是无论如何,开发出的应用程序都要和服务器程序配合,才能为用户提供服务。

这样,服务器程序就需要为不同的框架提供不同的支持。这样混乱的局面无论对于服务器还是框架,都是不好的。对服务器来说,需要支持各种不同框架,对框架来说,只有支持它的服务器才能被开发出的应用使用。

这时候,标准化就变得尤为重要。我们可以设立一个标准,只要服务器程序支持这个标准,框架也支持这个标准,那么他们就可以配合使用。一旦标准确定,双方各自实现。这样,服务器可以支持更多支持标准的框架,框架也可以使用更多支持标准的服务器。

WSGI(Web Server Gateway Interface)就是一种规范,它定义了使用Python编写的web应用程序与web服务器程序之间的接口格式,实现web应用程序与web服务器程序间的解耦。

常用的WSGI服务器有uWSGI、Gunicorn。而Python标准库提供的独立WSGI服务器叫wsgiref,Django开发环境用的就是这个模块来做服务器。

django

下载安装

1.命令行

pip3 install django==1.11.21 -i https://pypi.tuna.tsinghua.edu.cn/simple

2.pycharm

创建项目

1.命令行:

找一个文件夹存放项目文件:

打开终端:

django-admin startproject 项目名称

目录介绍

mysite/
├── manage.py  # 管理文件
└── mysite  # 项目目录
    ├── __init__.py
    ├── settings.py  # 配置
    ├── urls.py  # 路由 --> URL和函数的对应关系
    └── wsgi.py  # runserver命令就使用wsgiref模块做简单的web server

启动

1.命令行

切换到项目的根目录下 manage.py

python36 manage.py runserver —— http://127.0.0.1:8000/

python36 manage.py runserver 80 在80端口启动

python36 manage.py runserver 0.0.0.0:80 0.0.0.0:80

2.pycharm

点绿三角启动 可配置

简单使用

模板 ——》HTML 指定文件夹

urls.py

# 导入
from django.shortcuts import HttpResponse,render

# 函数
def index(request):
    # return HttpResponse('index')
    return render(request,'index.html')

# url和函数对应关系
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/', index),
]

1.django起一个服务器

命令行起一个django项目

项目文件名可以改,但是最好不要改,项目同名子文件夹不要改

day52 ORM

内容回顾

1.http协议

请求方式 8种 get post head put delete options trace connect

状态码

1xx

2xx 200 ok 成功

3xx 重定向

4xx 请求的错误 404 403 402

5xx 服务器的错误 500

url

https://www.baidu.com/s?wd=grid&rsv_spt=1

请求(request 浏览器给服务器发送的消息)

“请求方式 URL路径 HTTP/1.1\r\n

k1:v1\r\n

k2:v2\r\n

\r\n

请求数据(请求体)” ——》 get没有请求数据

响应(response 服务器返回给浏览器的信息)

“HTTP/1.1 状态码 状态描述\r\n

k1:v1\r\n

k2:v2\r\n

\r\n

响应数据(响应体)” ——》 HTML文本

2.浏览器发送请求和接受响应的过程

  1. 在浏览器上的地址栏种输入URL,回车,发送get请求;
  2. 服务器接收到请求,获取URL的路径,根据路径做不同的操作,把返回的数据封装到响应体中,返回给浏览器
  3. 浏览器接受到响应,双方断开连接
  4. 浏览器从响应体种获取数据,进行解析渲染。

3.web框架

本质:socket服务端

功能:

  1. socket收发消息 wsgi wsgiref uWSGI
  2. 根据不同的路径返回不同的内容
  3. 动态页面(字符串的替换 ——》 模板的渲染) jinja2

django 2 3

flask 2

tornado 1 2 3

4.django

下载

1.命令行:

pip install django==1.11.21 -i https://pypi.tuna.tsinghua.edu.cn/simple

创建项目

1.命令行

django-admin startproject 项目名称

2.pycharm

启动

1.命令行

cd 项目的根目录 ——》 manage.py

python manage.py runserver # 127.0.0.1:8000

python manage.py runserver 80 # 127.0.0.1:80

python manage.py runserver 0.0.0.0:80 # 0.0.0.0:80

2.pycharm

今日内容

1.静态文件的配置和使用

1.静态文件的配置和使用

settings.py

STATIC_URL = '/static/'   # 别名
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static1'),
    os.path.join(BASE_DIR, 'static'),
    os.path.join(BASE_DIR, 'static2'),
]
<link rel="stylesheet" href="/static/css/login.css">   # 别名开头

按照STATICFILES_DIRS列表的顺序进行查找。

2.简单的登录的实例

form表单提交数据注意的问题:

  1. 提交的地址action="" 请求的方式 method="post"
  2. 所有的input框有name属性
  3. 有一个input框的type="submit" 或者 有一个button

提交POST请求,把settings中MIDDLEWARE的'django.middleware.csrf.CsrfViewMiddleware'注释掉

3.app

创建APP

命令行

python manage.py startapp app名称

pycharm工具

tools ——》 run manage.py task ——》 startapp app名称

注册APP

INSTALLED_APPS = [
    ...
    'app01',
    'app01.apps.App01Config',  # 推荐写法
]

4.ORM

Django中使用MySQL数据库的流程

1.创建一个MySQL数据库。

2.在settings中配置,Django连接MySQL数据库:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',    # 引擎   
        'NAME': 'day53',                        # 数据库名称
        'HOST': '127.0.0.1',                    # ip地址
        'PORT':3306,                            # 端口
        'USER':'root',                          # 用户
        'PASSWORD':'123'                        # 密码
        
    }
}

3.在与settings同级目录下的 init文件中写:

import pymysql
pymysql.install_as_MySQLdb()

4.创建表(在app下的models.py中写类):

from django.db import models

class User(models.Model):
    username = models.CharField(max_length=32)   # username varchar(32)
    password = models.CharField(max_length=32)   # username varchar(32)

5.执行数据库迁移的命令

python manage.py makemigrations # 检测每个注册app下的model.py 记录model的变更记录

python manage.py migrate # 同步变更记录到数据库中【具体的迁移,迁移到文件中】(执行完这一步以后就可以看到表结构了)

request.method=="POST"
request.method=="GET"

orm操作

$flag 上一页 下一页