一、Views
views模块为MVC中的C——Controller,逻辑处理,是连接MTV中model(数据库数据)与Template(视图模块)的结合,将数据库中的数据显示到视图中
视图的本质就是一个python中的函数
Django中,视图主要用来接受Web请求,并做出响应
视图的响应分为两种:
- 以JSON数据形式返回
- 以网页的形式返回(重定向到另一个页面、错误视图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
- Request
二、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是变量中存储的数据