Python Django Views逻辑处理 及 Urls路由规则

一、Views

views模块为MVC中的C——Controller,逻辑处理,是连接MTV中model(数据库数据)与Template(视图模块)的结合,将数据库中的数据显示到视图中

视图的本质就是一个python中的函数

Django中,视图主要用来接受Web请求,并做出响应

视图的响应分为两种:

  1. 以JSON数据形式返回
  2. 以网页的形式返回(重定向到另一个页面、错误视图40X,50X)

视图响应的过程:浏览器输入——>django获取信息并去掉IP:端口号,剩下路径——>urls路由匹配——>视图响应——>回馈到浏览器

Views  视图函数

  • MTV中的View,相当于Controller作用,控制器  接收用户输入(请求),协调模版模型,对数据进行处理
  • 路由器urls
    • urlpatterns
    • 根路由url中,我们会使用include形式将整个子路由添加进来
      • 第一个参数:正则匹配的路径
      • 第二个参数:包含那个路由
      • 第三个参数:namespace
    • 子路由中,前两个参数一致
      • 第三个参数:name
      • 以后我们会根据namespace:name 动态获取我们的路由(path)
    • 请求参数
      • 路径参数
        • 位置参数
          • 使用圆括号包含规则
          • 一个圆括号代表一个参数
          • 代表视图函数上的一个参数
          • 参数个数和视图函数上的参数一一对应(除默认request)
        • 关键字参数
          • 可以在圆括号指定参数名字  (?P<name> reg)
          • 视图函数中存在和圆括号中name对应的参数
          • 参数不区分顺序
          • 个数也需要保持一致,一一对应
      • 请求参数
      • 反向解析
        • 在模版中使用
        • {% url %}
          • {% url 'namespace:name' %}
          • 如果存在位置参数:{% url 'namespace:name' value1 value2 ... %}
          • 如果存在关键字参数:{% url 'namespace:name' key1=value1 key2=value2 ... %}
      • 规则
        • 按照书写顺序,从上到下匹配
        • 没有最优匹配的原则,匹配到就停止
  • 双R
    • Request  
      • django框架根据Http请求报文自动生成的一个对象
      • 包含请求各种信息
      • path、method(GET、POST请求)、encoding、GET(QueryDict、类字典结构key-value,一个key可以对应多个值、get、getlist)、POST、FILES、COOKIES、session、is_ajax()
      • META:元信息  包括:客户端id的所有信息、IP地址等
    • Response

 

二、Urls

路由

  • 按照列表的书写顺序进行匹配,从上到下匹配,没有最优匹配的概念
  • 路由规则编写:通常直接指定'xxx',在结尾添加反斜线  /,path(‘xxx/', views.xxx)

URL组成:http |  ://www.xxx.com  |  /xx/index/  |  ?u_token=xxx&u_time=14.37  |  #footer

  • http:schema协议    常见有http、https、ftp传文件、rtmp直播流
  • www.xxx.com:域名  ip:port  http没有书写端口则默认是80端口
  • /xxx/index/:路径path    相当于主机的绝对路径
  • ?u_token=xxx&u_time=14.37:GET请求参数(QueryString 查询参数)
  • #footer:锚点,页面中的定位方式

路由路径中参数使用()进行获取

  • 一个圆括号对应视图函数中
  • 参数:
    • 路径参数
      • 位置参数:按照书写顺序进行匹配
      • 关键字参数:(?P<参数名称>\d+)  按照参数名称匹配,和顺序无关
    • 参数个数必须和视图函数中参数个数一致(除默认的request以外)

 

url反向解析:根据路径中注册的标识动态获取路径

使用反向解析的优点:如果在视图模板中使用硬编码连接,在url配置发生改变时,需要变更的代码会非常多,这样导致我们的代码结构不是很容易维护,使用反向解析可以提高我们代码的扩展性和可维护性。

  • 根据根路由中注册的namespace和在子路由中注册的name,这两个参数来动态获取我们的路径
  • 在模版中使用 {% url 'namespace:name' %}
  • 如果带有位置参数 {% url 'namespace:name' value1 value2 [valuen...] %}
  • 如果带有关键字参数 {% url 'namespace:name' key1=value1 key2=value2 [keyn=valuen...]%}

 

Django使用时,2.0版更新后不能用之前include namespace的方式书写

在网页项目中使用include()方法
项目目录中同时存在app/urls.py和proj/urls.py
在proj/urls.py使用include方法
from django.urls import path,include
from app import urls as app_url
urlpatterns = [
    path('xxx/', include(app_url, namespace='common')),
]

在app/urls.py中对应url
from django.urls import path
from .views import index
urlpatterns = [
    path('',index,name='index'),
]

runserver发生错误
django.core.exceptions.ImproperlyConfigured: 
Specifying a namespace in include() without providing an app_name is not supported. 
Set the app_name attribute in the included module, 
or pass a 2-tuple containing the list of patterns and app_name instead.
意思为:
在include方法里面指定namespace却不提供app_name是不允许的。
在包含的模块里设置app_name变量,或者在include方法里面提供app_name参数。

解决方法
在项目的urls.py文件中,即  proj/urls.py中修改

from django.urls import path,include
from app import urls as app_url
urlpatterns = [
    path('xxx/', include((common_url,'common'), namespace='common')),
]

方法2:在应用  app/urls.py中修改

from django.urls import path
from .views import index
app_name='common'
urlpatterns = [
    path('xxx/',index,name='index'),
]

 

使用方式:

在页面html5文件中使用反向代理:

<a href="{% url 'second:learn' %}">Go Go Go</a>    #second 为project urls中的namespace    learn为App中的name

 

错误页面定制

  • 在模版中重写对应错误状态码页面,例如新建404.html页面
  • 关闭Debug
  • 实现原则:接近原则

 

双R

Request

  • path    请求的完整路径
  • method  请求的方法,常用GET,POST
  • encoding  编码方式,常用utf-8
  • GET  类似字典的参数,包含了get的所有参数
    • 类字典结构
    • 一个key允许对应多个值
    • get、getlist
  • POST  类似字典的参数,包含了post的所有参数
  • FILES  类似字典的参数,包含了上传的文件
  • COOKIES  字典,包含了所有COOKIE
  • session  类似字典,表示会话
  • 方法:is_ajax()  判断是否是ajax(),通常用在移动端和js中
  • META
    • 各种客户端元信息
    • REMOTE_ADDR远端访问IP

Resonse

 

知识点

locals

  • 内置函数
  • 将局部变量使用字典的方式进行打包
  • key是变量名,value是变量中存储的数据
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章