Django框架(一)

一、Python Web框架

1.Web应用程序处理流程

Django框架(一)_第1张图片

说明:1.首先浏览器给Web服务器发送HTTP请求。2.服务器接收到请求后解析请求,然后发送给Web后端框架。3.后端框架接收到请求后进行处理(如封装js、数据库交互、业务处理等操作)。4.处理结束后把HTTP的响应对象返回给服务器。5.服务器把接收到的HTTP响应对象报文最后返回给浏览器。6.最终浏览器得到想要的页面。

2.Web程序框架的意义

  • 用于搭建Web应用程序
  • 避免代码重复编写,只需要关心Web应用核心的业务逻辑实现

3.Web应用程序的本质

  • 接受并解析HTTP请求,获取具体的请求信息
  • 处理本次HTTP请求,即完成业务逻辑处理
  • 构造并返回处理结果——HTTP响应

4.Web框架的流程

  • 1.搭建工程程序
    • 工程的搭建
    • 工程的配置
    • 路由定义
    • 视图函数定义
  • 2.操作request对象
  • 3.构造response对象
  • 4.使用中间层、模板、数据库等

二、Django框架

1.django框架的介绍

Django,发音类似于(粘构)。是用python语言编写的开源web开发框架,并遵循MVC设计模式。Django的主要目的是简便、快速的开发数据库驱动的网站。它强调代码复用,多个组件可以很方便的以“插件”形式服务于整个框架,Django有很多功能强大的第三方插件,也可以开发出自己的工具包。使得Django有很强的可扩展性,它还强调快速开发和DRY原则。

2.Django的特点

1)重量级框架

  • 提供项目工程管理的自动化脚本工具

  • 数据库ORM支持(对象关系映射)

  • 模板

  • 表单

  • Admin管理站点

  • 文件管理

  • 认证权限

  • session机制

  • 缓存

    2)MVT设计模式

  • 先来了解一下另一种设计模式MVC,其核心思想是分工、解耦,让不同的代码之间降低耦合,增强代码的可扩展性和可移植性,实现向后兼容。

  • MVC模式的图解

Django框架(一)_第2张图片

  • M为Model,主要是对数据库的交互,对数据库中的数据进行增删改查操作

  • V为View,主要是用于封装,来生成展示给浏览器的html用户

  • C为Controll,主要是用于接受请求,处理业务逻辑,返回结果,与Model和View交互调度

    3)Django使用的是MVT设计模式

  • 其MVT设计模式是在MVC模式发展而来的

Django框架(一)_第3张图片

  • M为Model,与MVC中的M功能相同
  • V为View,与MVC中的C的功能相同
  • T为Template,与MVC中的V功能相同

三、工程搭建

1.创建虚拟环境(所有安装包的过程都需要联网)

mkvirtualenv 虚拟环境名字 -p python3
例:
mkvirtualenv django_env - p python3

2.安装Django包

进入虚拟环境后输入:
pip3 install django==1.11.11
安装完成后输入pip3 list查看一下是否存在django1.11.11

3.相关命令

# 虚拟环境
mkvirtualenv # 创建虚拟环境
rmvirtualenv # 删除虚拟环境
workon # 查看所有虚拟环境和切换虚拟环境
deactivate # 退出当前虚拟环境
# pip3
pip3 install # 联网安装包
pip3 unstall # 卸载安装包
pip3 list # 查看安装包

4.创建工程

  • 1.创建工程

    django-admin startproject 工程名字
    例:
    django-admin startproject zdemo
    # 这个工程会创建在当前目录下,所以想要在那个目录下创建工程就先到那个目录下,或者加上路径。
    
  • 2.工程目录说明

    cd zdemo # 进入工程目录
    tree  # 即可查看当前工程中的目录信息
    

    说明:

    • 与项目同名的目录是工程文件
    • settings.py是项目整体的配置文件
    • urls.py是项目的路由配置文件
    • wsgi.py是项目与WSGI协议兼容的Web服务器入口
    • manage.py是项目的管理文件

    3.运行开发服务器

    在开发阶段,为了能够快速预览到开发的效果,django提供了一个纯python编写的轻量级web服务器,仅供在开发阶段使用。

    运行服务器的命令如下:

    python3 manage.py runserver ip:端口  # ip和端口号可以不写,默认是127.0.0.1 和 8000
    

    4.验证

    此时在浏览器输入127.0.0.1:8000便可以看到效果

Django框架(一)_第4张图片

5.创建项目的子应用

在web应用中,通常有一些业务逻辑功能模块是在不同的项目中都可以用到的,所以在开发的过程中通常将项目拆分为不同的子功能模块,各功能模块间保持相对的独立,在其他工程项目中需要用到某个特定给功能的模块时,可以将该模块代码整体复制过去,达到复用。

Django的视图编写也是放在子应用中的

  • 1.创建子应用

    python3 manage.py startapp 子应用名称
    例:
    python3 manage.py startapp params
    # 需要先进入的工程目录下再进行创建子应用
    

    执行后,可以看到工程目录中多了一名为params的子目录

  • 2.子应用目录说明

    • admin.py文件是网站的后台管理站点的配置文件
    • apps.py文件是配置当前子应用的相关信息
    • migrations是用于存放数据库迁移历史文件
    • models.py是用于保存数据库模型类
    • tests.py文件是用于开发测试的
    • views.py文件是编写Web应用视图函数
  • 3.注册安装子应用

    创建出来的子应用目录虽然被放到了工程项目目录中,但是django工程不能立即直接使用该子应用,需要在注册安装后才能使用。

    在工程配置文件settings.py中,INSTALLED_APPS保存了工程已经注册安装的子应用。

    • 此时需要将子应用的配置文件信息apps.py中的Config类添加到这个列表中。
    • 例如,将刚创建的params子应用添加到工程中,可以在INSTALLED_APPS列表中添加:
    • ‘params.apps.ParamsConfig’

6.创建视图

视图是用来编写web应用的业务逻辑。Django的视图是定义在子应用views.py中的

  • 1.创建视图

    打开刚创建的params模块,在views.py中编写视图代码

    from django.http import HttpResponse
    
    def index(request):
        
        return HttpResponse("好久不见..")
    
    

    说明:

    • 视图函数的第一个参数必须定义,用于接受Django构造的包含了请求数据的HttpRequest对象,通常名为request
    • 视图函数的返回值必须为一个响应对象,不可以想Flash一样直接返回一个字符串,可以将要返回的字符串都放入HttpResponse对象中
  • 2.定义路由URL

    • 1)在子应用中创建一个urls.py的文件用于保存该应用的路由(可从主路由中复制)

    • 2)在params/urls.py文件中定义路由信息

      from django.conf.urls import url
      from . imrpot views
      
      urlpatterns = {
          # 添加
          url(r'^login/$', views.index),
      }
      
      
  • 3.在工程总路由zdemo/urls.py中添加子应用的路由

    from django.conf.urls import urls, include
    from django.contirb import admin
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls), # django默认的
        # 添加
        url(r'^users', include('params.urls')),
        
    ]
    
    

    说明:

    • 使用include来将子应用params里的全部路由包含进工程路由中
    • r’^users’决定了params的子应用的所有路由都/users/开头,如我们刚才定义的视图login,最终访问的时候的完整路径为/users/login/。
  • 4.启动运行测试

    python manage.py runserver
    
    

    在浏览器中输入127.0.0.1:8000/users/login/

7.配置文件

settings.py配置文件中的主要内容描述

    1. BASE_DIR

      表示当前工程的根目录,Django会以此来定位工程内的相关文件,我们也可以通过使用该参数来构造文件路径

    2. DEBUG

      调试模式,创建工程后初始值为True,也就是说默认工作在调试模式下

      作用:

      • Django程序出现异常的时候,向前端显示详细的错误追踪信息

      注:部署线上运行的Django不要运行在调试模式下,记得在配置文件中修改DEBUG=False

    3. 本地语言和时区

      初始化的工程语言和时区默认为英语和UTC标准时区

      将语言和时区改为中国信息

      LANGUAGE_CODE = ‘zh-hans’

      TIME_ZONE = ‘Asia/Shanghai’

8.静态文件

项目中的CSS、图片、js都是静态文件。一般会将静态文件放在一个单独的目录中,以方便管理。在html页面中调试时,也需要指定静态文件的路径,Django中提供了一种解析方式配置静态文件路径。静态文件可以放在项目的根目录下,也可以放在应用的目录下,不过有些静态文件在项目中的通用的,所以推荐放在项目的根目录下,方便复用和管理。

为了提供静态文件,需要配置两个参数:

  • STATICFILES_DIRS=[]存放查找静态文件的目录,接受的是list
  • 例如查找当前项目工程中的static_img静态文件需要设置:
  • STATICFILES_DIRS=[os.path.join(BASE_DIR,‘statc_img’)]
  • STATIC_URL 默认存在,不需要更改

注意:

  • 仅在调试模式下能对外提供静态文件

9.路由说明

Django框架(一)_第5张图片

1.路由定义位置

Django的主要路由信息定义在工程同名目录下的urls.py文件中,该文件是Django解析路由的入口。

每个子应用为了保持相对独立,可以在各个子应用中定义属于自己的urls.py来保存子应用的路由。然后主路由文件中包含各个子应用的子路由数据。

2.路由解析顺序

Django在接收到一个请求时,从主路由文件中的urlpatterns列表中由上至下的顺序查找对应路由规则,如果发现规则为include包含,则再进入被包含的urls中的urlpatterns列表由上至下的进行查询。

值得关注的是由上至下的顺序查询,有可能会使上面的路由屏蔽掉下面的路由,带来非预期的效果。例如:

urlpatterns = [
    url(r'^say', views.say),
    url(r'^sayhello', views.sayhello),
]

即使访问sayhello/路径,预期应该进入sayhello视图执行,但实际优先查找到了say路由规则也与sayhello/路径匹配,实际进入了say视图执行。

路由屏蔽主要有三个原因:

  • 路由列表由上至下进行查找
  • 正则匹配默认匹配一个就结束
  • 路由路径没有写$结尾

3.路由命名与reverse逆序解析

1)路由命名

在定义路由的时候,可以为路由命名,方便查找特定视图的具体路径信息。

在使用include函数定义路由时,可以使用namespace定义路由的命名空间,如

url(r'^users', include('params.urls', namespace = 'zhuluyou')),

命名空间表示,凡是params.urls中定义的路由,均属于namespace指明的zhuluyou名下。

命名空间的作用:避免不同子应用中的路由使用了相同名字发生冲突,使用命名空间区别开。

2)在定义普通路由的时候,可以使用name参数指明路由的名字,如

url(r'^login',views.index,name='ziluyou1'),
url(r'^login11',views.index11,name='ziluyou2'),

3)reverse逆向解析

需要使用reserver函数,根据路由名称,返回具体的路径,如

from django.urls import reverse
def index(request):
  	url_path = reverse("zhuluyou:ziluyou1") # 返回/users/login

说明:

  • 对于未指明namespace的,reverse(“name”)
  • 对于指明namespace的,reverse(“namespace:name”)

4)路由结尾斜线 / 的说明

Django中定义路由时,通常以斜线/结尾,其好处是用户访问不以斜线/结尾的相同路径时候,Django会把用户重定向到以斜线/结尾的路径上,而不会返回404,如

urlpatterns = [
    url(r'^index/$',views.index,name = 'index'),
]
# 用户访问index或者index/网址均能访问到index视图

四、请求Request参数

1.URL路径参数

在定义路由URL时,可以使用正则表达式提取参数的方法从URL中获取请求参数,Django会将提取的参数直接传递到视图的传入参数。

  • 命名参数按名字传递,如

    url(r'^weather/(?P\w+)/(?P\d{4})/$',views.weather),
    
    def weather(request, year ,city):
        print("city = %s" % city)
        print("year = %s" % year)
        return HttpResponse("这是路径传参的网页!")
    
    
    

2.查询参数

获取请求路径中的查询字符串参数(如?k1=v1&k2=v2)可以通过request.GET属性获取。返回QueryDict对象。

def chaxun(request):
    a = request.GET.get('a')
    b = reuqest.GET.get('b')
    alist = requqest.GET.getlist('a')
    print(a)   
    print(b)
    print(alist)
    return HttpResponse("这是查询传参的网页!")

注意:查询字符串不区分请求方式,即使客户端使用POST方式请求,依然可以通过request.GET方式获取参数

HttpRequest对象的属性GET、POST都是QueryDict类型的对象

与python字典不一样,QueryDict类型的对象用来处理一键之值的情况

  • 方法get():根据键获取值

    如果一个键有多个值,那将获取最后一个值

    如果键不存在则返回None,但可以设置默认值

    dict.get('键',默认值)
    # 可简写为
    dict['键']
    
    
  • 方法getlist():根据键获取值,值以列表的方式返回。可以获取指定键的所有值

    如果键不存在则返回空列表[],也可以设置默认值

    dict.getlist('键',默认值)
    
    

3.请求体参数

请求体参数分为表单和非表单

请求体数据格式不固定,可以是表单类型的字符串,也可以是JSON字符串,XML字符串,应该区别对待。

可以发送请求体数据的请求方式有POST、PUT、PATCH、DELETE

Django默认开启了CSRF防护,会对上述请求方式进行CSRF防护验证,在测试的时候可以关闭CSRF防护机制。

注释掉图中的中间行。
Django框架(一)_第6张图片

1)表单类型Form Data

前端发送的表单类型的请求体数据,可以通过request.POST属性获取,返回QueryDict对象

def biaodan(requqest):
    a = request.POST.get('a')
    b = request.POST.get('b')
    alist = request.POST.getlist('a')
   	print(a)
    print(b)
    print(alist)
    return HttpResponse("这是表单类型传参的请求体数据网页!")

注意:request.POST只能用来获取POST方式请求的表单数据

2)非表单类型Non-Form Data

非表单类型的请求体数据,Django无法自动解析,可以通过request.body属性来获取最原始的请求体数据,返回bytes类型

def feibiaodan(requqest):
    # 先将非表单的请求体数据转换为原始数据
    json_str = request.body
    # 然后再解码
    json_str = requqest.decode()
    # 再将字符类型转换为字典类型
    import json
    json_dict = json.loads(json_str)
    print(json_dict)
    return HttpResponse("这是非表单类型的请求体数据网页!")
    

说明:此时的json_dict是字典类型,所以可以自行操作。

4.请求头参数

可以通过reuqest.META属性来获取请求头headers中的数据,request.META为字典类型

常见的请求头如下:

CONTENT_LENGTH – The length of the request body (as a string).
CONTENT_TYPE – The MIME type of the request body.
HTTP_ACCEPT – Acceptable content types for the response.
HTTP_ACCEPT_ENCODING – Acceptable encodings for the response.
HTTP_ACCEPT_LANGUAGE – Acceptable languages for the response.
HTTP_HOST – The HTTP Host header sent by the client.
HTTP_REFERER – The referring page, if any.
HTTP_USER_AGENT – The client’s user-agent string.
QUERY_STRING – The query string, as a single (unparsed) string.
REMOTE_ADDR – The IP address of the client.
REMOTE_HOST – The hostname of the client.
REMOTE_USER – The user authenticated by the Web server, if any.
REQUEST_METHOD – A string such as "GET" or "POST".
SERVER_NAME – The hostname of the server.
SERVER_PORT – The port of the server (as a string).

具体使用:

def requqest_headers(requqest):
    content_length = request.META["CONTENT_LENGTH"]
    HTTP_ACCEPT = request.META["HTTP_ACCEPT"]
    zidingyi = request.META.get("HTTP_zidingyi")
    return HttpResponse("这是测试请求头参数的网页!")

5.了解其他HttpRequest对象属性

  • method:一个字符串,表示请求使用的HTTP,常用:‘GET’,‘POST‘。
  • user:请求的用户对象
  • path:一个字符串,表示请求的页面的完整路径,不包含域名和参数部分
  • encoding:一个字符串,表示提交的数据的编码模式,一般默认为utf-8
  • FILES:一个类似于字典的对象,包含所有的上传文件

五、响应对象操作response

视图在接受请求并处理后,必须返回HttpResponse对象或者子对象。HttpRequest对象由Django创建,HttpResponse对象由开发人员创建。

1.HttpResponse

可以使用django.http.HttpResponse来构造响应对象

HttpResponse(content = 响应体,content_type=响应体数据类型,status=状态码)

也可以通过HttpResponse对象属性来设置响应体、状态吗

  • content:表示返回的内容
  • status_code:表示返回的HTTP响应状态码
  • 响应对象[‘key’] = value:表示设置给属性赋值
from django.http import HttpResponse

# 通过参数返回
def res_header(request):
    return HttpResponse(content="响应体的内容网页",content_type="text/html; charset=utf-8",status=521)
# 通过属性设置
def res_header(request):
    # 设置响应对象
    response = HttpResponse("这是响应体测试的网页!")
    response["Iamheader"] = "response_header"
    response.content="这这个才是最后显示在网页中的内容!会把之前的覆盖!"
    response.status_code= 500
    return response


2.HttpResponse子类

Django提供了一系列HttpResponse的子类,可以快速设置状态码

HttpResponseRedirect 301
HttpResponsePermanentRedirect 302
HttpResponseNotModified 304
HttpResponseBadRequest 400
HttpResponseNotFound 404
HttpResponseForbidden 403
HttpResponseNotAllowed 405
HttpResponseGone 410
HttpResponseServerError 500

3.JsonResponse

若要返回json数据,可以使用JsonResponse来构造响应对象,作用:

  • 1.帮助我们将数据转换为json字符串
  • 2.设置响应头Content-Type = application/json
from django.http import JsonResponse

def jsonR(request):
    dict_data = {"name":"wtt","age",22,"address":"fux"}
    return JsonResponse(dict_data)


4.rediect重定向

比如我们输入www.baidu.com 会自动重定位到https://www.baidu.com/ 这个过程就是重定向

from django.shortcuts import redirect

def Redirect(request):
    # 为了正确性所以这里使用reverse先转换为路径
    url_path = reverse("namespace:name")
    # 使用重定向
    return redirect(url_path)
 

说明:当用户输入网址调用到Redirect函数时候会重定向到reverse中所指明的路径

你可能感兴趣的:(Django框架(一))