• Django视图


    HttpRequests对象

    利用http协议向服务器传参的4种途径

    • 提取url特定部分,如/web/index/,可以通过在服务器端的路由中用正则表达式截取
    • 查询字符串,形如?key1=value&key=value2,(?前面是路由,后面是字符串
    • 在请求体(body)中发送数据,比如表单数据json、xml
    • 在http报文的头(header)中

    url路径参数

    如果想从url中获取参数值,例如:http://127.0.0.1/index/file

    更改路由匹配为占位符,用来接收请求中的参数

    1. urlpatterns = [
    2. path('//',index ),
    3. ]

    视图中函数:参数的位置不能错

    1. from django.shortcuts import render
    2. from django.http import HttpResponse
    3. # Create your views here.
    4. def index(request,path_name,file_name):
    5. return HttpResponse("请求的资源路径是/%s/%s"%(path_name,file_name))

     图解

    查询字符串 

    http://ip/path/path?key=value&key=value

    url以?分割为两部分。?前面是请求路径,后边是查询字符串,类似于字典多个值用&拼接

    可以使用request.GET来获取,返回的是一个QueryDict字典,这个字典和python中的字典不同。

    这个字典可以一键多值,但是也可以使用python字典的方法来处理

    使用字典的get方法获取字典键的值

    1. from django.shortcuts import render
    2. from django.http import HttpResponse
    3. # Create your views here.
    4. def index(request,path_name,file_name):
    5. query_str=request.GET
    6. data1=query_str.get("key1")
    7. data2=query_str.get("key2")
    8. print(query_str)
    9. print(data1)
    10. print(data2)
    11. """
    12. file_name
    13. file_type
    14. """
    15. return HttpResponse("请求的资源路径是/%s/%s"%(path_name,file_name))

    使用字典getlist方法获取一个键的多个值返回一个列表

    1. from django.shortcuts import render
    2. from django.http import HttpResponse
    3. # Create your views here.
    4. def index(request,path_name,file_name):
    5. query_str=request.GET
    6. data_list=query_str.getlist("key1")
    7. print(query_str)
    8. print(data_list)
    9. """
    10. ['file_name', 'file_path']
    11. """
    12. return HttpResponse("请求的资源路径是/%s/%s"%(path_name,file_name))

    在请求体中发送数据 

    传递from表单数据

    使用postman发送一个post请求,发现状态码是403,django默认是对post请求验证的

    下面修改setting.py中的配置代码,跳过对post请求的验证

    使用POST方法接收请求体中的参数 

    json数据请求和接收 

    使用postman发送json数据

    使用body方法来接收json数据,接收到的数据是二进制的,需要转成字符串然后再使用json的loads方法转成puthon中的字典

     将字符串转换成字典

    请求头 

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

    其他的HttpsRequest对象属性

    • method:一个字符串,表示请求使用的HTTP方法,常用值包括“GET”、"POST"
    • user:请求的用户对象
    • path:一个字符串,表示请求的页面的完整路径,不包含域名和参数部分
    • encoding:一个字符串,表示提交的数据的编码方式
      • 如果为None表示使用浏览器的默认设置,一般为utf-8
      • 属性值是可以更改的,可以通过修改它来修改访问表单数据使用的编码
    • FILES:一个类似于字典的对象,包含所有的上传文件

    转换器

    作用:验证请求路径中的参数

    • 在视图函数中添加判断验证(代码复用低)
    • 转换器(代码复用高)

    自定义一个转换器

    1. from django.urls import path
    2. from test_apps.views import index,register
    3. from django.urls.converters import register_converter
    4. # 定义转换器
    5. class PhoneConverter:
    6. regex = '1[3-9]\d{9}'
    7. # 验证没有问题的数据,给视图函数
    8. def to_python(self, value):
    9. return int(value)
    10. # def to_url(self, value):
    11. # return str(value)
    12. # 注册转换器
    13. # def register_converter(converter, type_name):
    14. # converter 转换器类
    15. # type_name 转换器的名字
    16. register_converter(PhoneConverter,"phone")
    17. # 使用转换器
    18. urlpatterns = [
    19. path('//',index ),
    20. path('register',register),
    21. # path('json',json)
    22. ]

    自定义一个转换器实现对手机号的验证

    定义转换器

    1. # 定义转换器
    2. class PhoneConverter:
    3. regex = '1[3-9]\d{9}'
    4. # 验证没有问题的数据,给视图函数
    5. def to_python(self, value):
    6. return int(value)
    7. # def to_url(self, value):
    8. # return str(value)

    注册转换器

    1. from django.urls.converters import register_converter
    2. # 注册转换器
    3. # def register_converter(converter, type_name):
    4. # converter 转换器类
    5. # type_name 转换器的名字
    6. register_converter(PhoneConverter,"phone")

    使用转换器

    1. # 使用转换器
    2. urlpatterns = [
    3. path('//',index ),
    4. path('register',register),
    5. # path('json',json)
    6. ]

    HttpResponse对象

    使用django.htrtp.HttpResponse来构造响应对象

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

    响应状态码

    分类 

    状态码分类说明
    1XX响应中--临时状态码,表示请求已经接受,告诉客户端应该继续请求或者如果它已经完成则忽略它
    2XX成功--表示请求已经被成功接受,处理已完成
    3XX重定向--重定向到其他地方(让客户端再发起一个请求以完成整个处理)
    4XX客户端错误--处理发生错误,责任在客户端,如:客户端的请求一个不存在的资源,客户端未被授权,禁止访问等
    5XX服务器端错误--处理发生错误,责任在服务器端,如:服务端抛出异常,路由出错,HTTP版本不支持等

    常见状态码

    状态码英文描述解释
    200OK客户端请求成功,即处理成功
    302Found只是所请求的资源已移动到由Location响应头给定的URL,浏览器会自动重新访问到这个页面
    304Not Modified告诉客户端,你请求的资源至上次取得后,服务端并未更改,你直接用你本地缓存吧。隐式重定向
    400Bad Request客户端请求有语法错误,不能被服务器所理解
    403Forbidden服务器收到请求,但是拒绝提供服务,比如:没有权限访问相关资源
    404Not Found请求资源不存在,一般是URL输入有误,或者网站资源被删除了
    428Precondition Required服务器要求有条件的请求,告诉客户端要想访问资源,必须携带特定的请求头
    429Too Many Requests太多请求,可以限制客户端请求某个资源的数量,配合Retry-After(多长时间后可以请求)响应头一起使用
    431Request Header Fields Too Large请求头太大,服务器不愿意处理请求,因为它的头部字段太大。请求可以在减少请求头域的大小后提交
    405Method Not Allowed请求方式有误,比如:应该用GET请求方式的资源,而用了POST
    500Internal Server Error服务器发生不可预期的错误,表示服务器出异常了
    503Service Unavailable服务器尚未准备好处理请求,比如:服务器刚刚启动,还未初始化好
    511

    Network Authentication Required

    客户端需要进行身份验证才能获得网络访问权限

    响应头可以直接将HttpResponse对象当作字典进行响应头键值对的设置

    1. response=HttpResponse()
    2. # 自定义响应头name,值为python
    3. respone["name"]="python"

    JsonrResponse

     将字典直接转换成json字符串

    1. def json_response(request):
    2. info={
    3. "name":"小明",
    4. "age":18
    5. }
    6. return JsonResponse(data=info)

     将其他类型的数据转换成json字符串

    1. def json_response(request):
    2. info=[
    3. {
    4. "name": "小明",
    5. "age": 18
    6. },
    7. {
    8. "name":"王刚",
    9. "age":20
    10. }
    11. ]
    12. return JsonResponse(data=info,safe=False)

    重定向

    1. from django.shortcuts import redirect
    2. def redirects(request):
    3. return redirect("http://www.baidu.com")

    状态保持

    • cookie:客户端存储信息
    • session:服务端存储信息

    cookie

    • cookie以键值对的格式进行信息的存储
    • cookie基于域名安全,不同域名的cookie是不能互相访问的
    • 当浏览器请求某网站时,会将浏览器存储的跟网站相关的所有cookie信息提交给网站服务器

    1. """
    2. 第一次请求,携带查询字符串
    3. 服务器收到请求之后,获取username,服务器设置cookie信息,cookie信息包括username
    4. 浏览器接收到服务器的响应后,应该把cookie保存起来
    5. 第二次及其以后的请求,都会携带cookie信息,服务器就可以读取cookie信息,用来判断用户身份
    6. """
    7. def set_cookie(request):
    8. # 查询字符串数据
    9. name=request.GET.get("username")
    10. # 服务器设置cookie信息
    11. # 通过响应对象.set_cookie方法
    12. response=HttpResponse("name")
    13. # .set_cookie方法将数据存放在本地cookie中,通过.COOKIES获取
    14. response.set_cookie("name",name)
    15. return response
    16. def get_cookie(request):
    17. # {'name': 'xiaoming'},requset.COOKIES返回的是一个字典数据
    18. name=request.COOKIES.get("name")
    19. # 将数据直接返回
    20. return HttpResponse(name)

    设置cookie到期时间

    1. # max_age= 是一个秒数,从响应开始计数的一个秒数
    2. response.set_cookie("name",name,max_age=60*60)

    删除cookie 

    1. # 原理是将cookie有效期设置为0
    2. request.delete_cookie("name")

    session 

    修改数据库中的sessionid,浏览器将找不到数据。

    通过resquest.session的方式设置session

    • session保存在服务器
    • session需要依赖于cookie
    • session存储于数据库中

     设置一个session

    1. """
    2. 第一次请求服务器端设置session信息
    3. 服务器同时会生成一个sessionid的cookie的信息
    4. 浏览器接收到这个信息后会把cookie数据保存起来
    5. 第二次及其以后的请求,都会携带这个sessionid,服务器会验证这个sessionid
    6. 验证没有问题会读取相关数据,实现业务逻辑
    7. """
    8. def set_session(request):
    9. # 1、获取用户信息
    10. name=request.GET.get("username")
    11. # 2、设置session信息
    12. request.session["username"]=name
    13. return HttpResponse("set_session")

    数据库中会被添加一条数据 

     获取session 

    1. def get_session(request):
    2. name=request.session.get("username")
    3. psw=request.session.get("password")
    4. content="{},{}".format(name,psw)
    5. return HttpResponse(content)

    session 保存到redis(具体使用参考官方文档)

    安装扩展

    pip install django-redis

    在settings.py配置redis做session存储

    1. # cache缓存
    2. CACHES={
    3. # 默认配置
    4. 'default':{
    5. # 使用redis类实现缓存
    6. 'BACKEND':'django_redis.cache.RedisCache',
    7. 'LOCATION':'redis://127.0.0.1:6379/1', # 主机端口和库
    8. 'OPTIONS':{
    9. 'CLIENT_CLASS':'django_redis.client.DefaultClient',# 设置客户端
    10. }
    11. }
    12. }
    13. # 服务引擎,使用缓存
    14. SESSION_ENGINE='django.contrib.sessions.backends.cache'
    15. # 指定缓存配置信息
    16. SESSION_CACHE_ALIAS='default'

    session过期与删除

    清除所有session,在存储中的值部分

    request.session.clear()

    清除session数据,在存储中删除session的整条数据

    request.session.flush()

    删除session中的指定键值,在存储中只删除某个键及对应值

    del request.session['键']

    设置session的有效期

    • 如果value是一个整数,session将在value秒没有活动后过期
    • 如果value为0,那么用户session的cookie将在用户的浏览器关闭时过期
    • 如果valu为None,那么session有效期将采用系统默认值,默认为两周,可以通过settings.py中设置SESSION_COOKIE_AGE来设置全局默认值
    request.session.set_expiry(value)

    类试图

    1. """
    2. 类试图的定义
    3. class 类试图名字(View):
    4. def get(self,requset):
    5. return HttpResponse('xxx')
    6. def http_method_lower(self,request):
    7. return HttpResponse('xxx')
    8. """
    9. from django.views import View
    10. class My_View(View):
    11. def get(self,requset):
    12. return HttpResponse('get get get ')
    13. def post(self,request):
    14. return HttpResponse('post post post')

    中间件

    django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改django的输入输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了django框架的健壮性。

    定义一个中间件

    必须继承自MiddlewareMixin

    1. from django.utils.deprecation import MiddlewareMixin
    2. class TestMiddleware(MiddlewareMixin):
    3. def process_request(self,request):
    4. print("每次请求前调用")
    5. def process_response(self,request,response):
    6. print("每次响应前调用")
    7. return response

    注册中间件 

    修改settings.py文件中的MIDDLEWARE

    1. MIDDLEWARE = [
    2. 'django.middleware.security.SecurityMiddleware',
    3. 'django.contrib.sessions.middleware.SessionMiddleware',
    4. 'django.middleware.common.CommonMiddleware',
    5. # 'django.middleware.csrf.CsrfViewMiddleware',
    6. 'django.contrib.auth.middleware.AuthenticationMiddleware',
    7. 'django.contrib.messages.middleware.MessageMiddleware',
    8. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
    9. 'test_apps.middleware.TestMiddleware',
    10. ]

    多个中间件的执行顺序

    • 在请求视图被处理前,中间件由上至下依次执行
    • 在请求视图被处理后,中间件由下至上依次执行
  • 相关阅读:
    LeetCode 第415场周赛个人题解
    regexp_extract用法
    【ESXi 8】安装ESXi 8.0 虚拟机
    这一次,我们把AI自治数据库带到了世界人工智能大会上
    一款国产开源 Web 防火墙神器!
    23软考备考已开始,网络工程师知识点速记~(3)
    【JAVA-Day31】深入解析冒泡、选择和插入排序在数组排序中的应用
    Python:处理XML文件汇总
    English语法_指示代词 this / these / that / those
    AT89S52单片机
  • 原文地址:https://blog.csdn.net/weixin_59912996/article/details/136070296