django学习(四)
django学习(四)
昨日回顾
django请求生命周期流程
? 一条请求从用户的客户端上发出之后,它首先会基于http协议去解析数据并封装,然后发送给__web服务网关接口__,(为了让服务网关能够接收到内容,服务器到客户端中间的通道一般可以叫做接口,我们目前使用的wsgiref就是使用wsgi接口的简易的服务器);然后这条请求就真正的到了后端之上,它首先会被django的门卫,中间件,中间件是一个轻量级、底层的插件,是对请求命令(request)与返回命令(response)之间的一道处理过程;通过了中间件后,django就会拿着入场名单(路由层urls.py)去筛选请求命令的后缀,会根据后缀将请求命令带到对应的宴会厅(视图层views.py),之后展示出满桌菜肴(模板层templates),然后这条请求想起自己的使命,来到控制台(模型层models.py)使用很厉害的orm操作,在仓库(db数据库)中完成使命;然后带着任务完成的信息一步步向上,经过模板层、视图层、中间件、web服务网关接口,最后基于http协议将返回信息打包并发送给客户端。
路由匹配
参数:url方法的第一个参数是正则表达式
特性:能从用户输入的后缀中匹配到内容
了解:追加斜杠匹配机制,取消机制:APPEND_SLASH = True
无名有名分组
无名分组:对正则加上括号,会自动将括号内匹配到的当做位置参数传递给视图函数
有名分组:对正则加上括号并起别名,视图函数需要使用别名对应的关键字参数去接受匹配到的内容
反向解析
基本反向解析:给对应关系起一个别名,前端和后端都可以根据这个别名去动态获取到对应关系
无名分组反向解析:当正则表达式可接受结果太多时,使用无名分组反向解析的时候需要在后面写入明确的内容
有名分组反向解析:同无名分组反向解析,只不过可以通过关键字赋值
路由分发
分路由:将路由的对应关系放入自己的app项目中
总路由:对分路由做一个管理和分发
今日学习内容
虚拟环境
django的多版本使用需要创建虚拟环境,不同版本在虚拟环境之下配置
创建虚拟环境:
-
选择File - Settings
2.进入 Project下 Project-Interpreter,点击show all
或者添加新的虚拟环境
django版本区别
1.x版本默认使用url,2.x,3.x版本默认使用path
url和path区别
url:支持正则,path:不支持正则
2.x,3.x想使用正则也可以使用,导入from django.urls import path,re_path,然后使用re_path
path方法提供了转换功能:
path('index//', index)
#1、五个内置转化器
- str:匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
- int:匹配正整数,包括0
- slug:匹配字母、数字、下划线以及横杠组成的字符串
- uuid:匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00
- path:匹配任何非空字符串,包含了路径分隔符(/),不能用"?"
#2、示例:
- path('login/', views.login),
- path('login/', views.login),
- path('login/',views.article),
#3、高级示例:
- 实现匹配这种路径:http://127.0.0.1:8000/jason/p/4444.html
- path('/p/.html', views.article),
- re_path(r'^(?P.*?)/p/(?P\d+).html$', views.login)
- url(r'^(?P.*?)/p/(?P\d+).html$', views.login)
# url在2.x之后的版本不建议使用,可以使用re_path代替
视图函数返回值
render源代码
def render(request, template_name, context=None, content_type=None, status=None, using=None):
"""
Return a HttpResponse whose content is filled with the result of calling
django.template.loader.render_to_string() with the passed arguments.
"""
content = loader.render_to_string(template_name, context, request, using=using)
return HttpResponse(content, content_type, status)
# 返回一个HttpResponse对象,多继承
JsonResponse对象
user_dict = {'k':'v', '汉字k': '汉字v'}
return JsonResponse(user_dict,json_dumps_params={'ensure_ascii':False})
JsonResponse源代码
class JsonResponse(HttpResponse): def __init__(self, data,json_dumps_params=None, **kwargs): data = json.dumps(data, **json_dumps_params)
封装了json模块,对json序列化的数据类型做了扩充
""" json模块,pychrm内部源代码自带表格
+-------------------+---------------+
| Python | JSON |
+===================+===============+
| dict | object |
+-------------------+---------------+
| list, tuple | array |
+-------------------+---------------+
| str | string |
+-------------------+---------------+
| int, float | number |
+-------------------+---------------+
| True | true |
+-------------------+---------------+
| False | false |
+-------------------+---------------+
| None | null |
+-------------------+---------------+
"""
form表单上传文件
form表单上传的数据中如果含有文件 那么需要做以下几件事
1.method必须是post
2.enctype必须修改为multipart/form-data
默认是application/x-www-form-urlencoded
3.后端需要使用request.FILES获取
file_obj = request.FILES # 获取文件数据
file_obj.get("file") # 获取其中的一个文件
file_obj["file"] # 获取其中的一个文件
file_obj["file"].name # 获取文件的文件名
request其他方法
request.method # 获取大写的请求类型
request.POST # 获取POST携带的数据
request.GET # 获取url?后面的数据
request.FILES # 获取文件
request.body # 存放的是接收过来的最原始的二进制数据
# request.POST、request.GET、request.FILES这些获取数据的方法其实都从body中获取数据并解析存放
request.path # 获取路径
request.path_info # 获取路径
request.get_full_path() # 获取路径并且还可以获取到路径后面携带的参数
FBV与CBV
FBV:基于函数的视图
url(r'^index/',函数名)
def render(request, template_name, context=None, content_type=None, status=None, using=None):
...
return HttpResponse(content, content_type, status)#返回了一个HttpResponse对象
CBV:基于类的视图
from django import views
class MyLoginView(views.View):
def get(self, request):
return HttpResponse("get")
def post(self, request):
return HttpResponse("post")
url(r'^ab_cbv/', views.MyLoginView.as_view())
@classonlymethod
def as_view(cls, **initkwargs):
def view(request, *args, **kwargs):
return self.dispatch(request, *args, **kwargs)
return view
# 返回了一个view,也就是dispatch
"""
如果请求方式是GET 则会自动执行类里面的get方法
如果请求方式是POST 则会自动执行类里面的post方法
"""
CBV源码剖析
1.urls.py :请求一定来执行视图下的as_view方法。也可以直接点击as_view()来找源码。
2.views.py:视图内没有as_view方法,则找父级的as_view方法。
3.源码:as_view返回自己下面的view方法,as_view执行了自己view方法,返回值是dispatch方法.
4.dispatch方法判断请求方式。
- 1.执行的都是dispatch方法,如果条件成立, 执行我们定义的方法
- 2.条件不成立,执行系统定义的http_method_not_allowed方法
模板语法传值
django传值只要两个符号:{{}} 和 {% %}
{{}} 主要用于变量相关的操作,用于引用
{%%} 主要用于逻辑相关操作,循环,条件判断
传值的两种方式
名字传值: return render(request, 'ab_temp.html', {'name':name})
# 适用于数据量较少
打包传值: return render(request, 'ab_temp.html', locals())
# locals() 将当前名称空间中所有的名字全部传递给html页面,使用资源较大
传值的范围
基本数据类型都可以
函数名:会自动将函数名调用之后的返回值传值,但是不支持函数参数
文件名:直接显示文件IO对象
类名:自动加括号实例化对象
对象名:显示对象的地址,并具备调用属性和方法的能力
取值:.句点符,.key(django内部自动识别)