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的多版本使用需要创建虚拟环境,不同版本在虚拟环境之下配置

创建虚拟环境:

  1. 选择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内部自动识别)

相关