美文网首页
Django常见数据类型提交、解析与响应

Django常见数据类型提交、解析与响应

作者: 越大大雨天 | 来源:发表于2019-05-20 15:55 被阅读0次

    Request请求

    http协议向客户端传参四种形式

    1. URL地址拼接传参
      • 传参示例:传递名字和年龄
        http://127.0.0.1:8000/user/index/xiaowang/26
      • 解析方式:
        路由正则内增加匹配:url(r'users/index/(?P<name>[a-zA-Z]+)/(?P<age>\d+)', views.index)
        对应视图函数写法:
    def index(request,name,age):
         print("name: %s, age: %s" % (name,age))
    
    1. URL查询字符串传参
      写法:?key=value&...
      • 传参示例:传递名字和年龄
        http://127.0.0.1:8000/user/index/?name=xiaozhang&age=26
      • 解析方式:
    def index(request):
         querydict = request.GET
         name = querydict.get("name")
         age = querydict.get("age")
    
    1. 请求体传参
    • 可以发送请求体数据的请求方式有POST、PUT、PATCH、DELETE。
    • Django默认开启了CSRF防护,会对上述请求方式进行CSRF防护验证,在测试时可以关闭CSRF防护机制,方法为在settings.py文件中注释掉CSRF中间件行:django.middleware.csrf.CsrfViewMiddleware
    • POST表单请求
      • 请求体传参不显示在url信息中
      • 解析方式:
      def get_postbody(request):
          name = request.POST.get("name")
          password = request.POST.get("password)
      

    重要:request.POST只能用来获取POST方式的请求体表单数据,其余请求体获取数据均采用下述的request.body

    • 非表单类型 Non-Form Data
      • 非表单类型的请求体数据,Django无法自动解析,可以通过request.body属性获取最原始的请求体数据,自己按照请求体格式(JSON、XML等)进行解析。request.body返回bytes类型。
      • 解析方式:例如获取json数据:
      import json
      
      def get_body_json(request):
          json_str = request.body
          json_str = json_str.decode()  # python3.6 无  需执行此步
          req_data = json.loads(json_str)
          print(req_data['a'])
          print(req_data['b'])
          return HttpResponse('OK')
      

    请求头

    可以通过request.META属性获取请求头headers中的数据,request.META为字典类型。
    其中包含HTTP_USER_AGENTSERVER_NAME等许多信息。

    • 获取示例:
      def get_headers(request):
          print(request.META['CONTENT_TYPE'])
          return HttpResponse('OK')
      

    其他HttpResponse对象属性

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

    Response响应

    HttpResponse

    可以使用django.http.HttpResponse来构造响应对象。

    • 设置方式:

      1. 传参方式:
      HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)
      
      1. 属性设置方式:
      response = HttpResponse()
      response.content = 响应体
      response.status_code = 404
      
    1. 响应头设置:
      # 可增加新的或修改已有请求头
      response = HttpResponse()
      response['Itcast'] = 'Python'  # 自定义响应头    Itcast, 值为Python
      
    • 总示例:
      from django.http import HttpResponse
      
      def demo_view(request):
          return HttpResponse('itcast python',   status=400)
          或者
          response = HttpResponse('itcast python')
          response.status_code = 400
          response['Itcast'] = 'Python'
          return response
      

    HttpResponse子类

    Django提供了一系列HttpResponse的子类,可以快速设置状态码

    • HttpResponseRedirect 301
    • HttpResponsePermanentRedirect 302
    • HttpResponseNotModified 304
    • HttpResponseBadRequest 400
    • HttpResponseNotFound 404
    • HttpResponseForbidden 403
    • HttpResponseNotAllowed 405
    • HttpResponseGone 410
    • HttpResponseServerError 500

    cookie设置和读取

    • Cookie以键值对Key-Value形势进行信息的存储。
    • Cookie基于域名安全,不同域名的Cookie是不能互相访问的
      1. 设置cookie
      可以通过HttpResponse对象中的set_cookie方法来设置cookie。

    HttpResponse.set_cookie(cookie名, value=cookie值, max_age=cookie有效期)

    • max_age 单位为秒,默认为None。如果是临时cookie,可将max_age设置为None。

    2. 读取cookie
    可以通过HttpRequest对象的COOKIES属性来读取本次请求携带的cookie值。request.COOKIES为字典类型。

    cookies = request.COOKIES

    session设置和储存

    session可保存在数据库、本地缓存中。

    • 为提高性能,常将session存在Redis中,此处以Redis为例
      1) 安装扩展

      pip install django-redis

      2)配置
      settings.py文件中如下设置:

      CACHES = {
      "default": {
      "BACKEND": "django_redis.cache.RedisCache",
      "LOCATION": "redis://127.0.0.1:6379/1",
      "OPTIONS": {
      "CLIENT_CLASS": "django_redis.client.DefaultClient",
      }
      }
      }
      SESSION_ENGINE = "django.contrib.sessions.backends.cache"
      SESSION_CACHE_ALIAS = "default"

    注意:

    • 如果redis的ip地址不是本地回环127.0.0.1,而是其他地址,访问Django时,可能出现Redis连接错误,需要在redis配置文件中添加特定ip地址。

    • redis://127.0.0.1:6379/1确定使用的数据库为第二个,查看时在redis使用select 1选择。

      3)session操作
      通过HttpRequest对象request的session属性进行会话的读写操作。

      • 以键值对格式写session:

      request.session[key] = value

      • 根据键读取值:

      request.session.get(key,默认值)

      • 设置session的有效期

      request.session.set_expiry(value)

      注:

    • 如果value是一个整数,session将在value秒没有活动后过期。

    • 如果value为0,那么用户session的Cookie将在用户的浏览器关闭时过期。

    • 如果value为None,那么session有效期将采用系统默认值,默认为两周,可以通过在settings.py中设置SESSION_COOKIE_AGE来设置全局默认值。

    相关文章

      网友评论

          本文标题:Django常见数据类型提交、解析与响应

          本文链接:https://www.haomeiwen.com/subject/nkbwaqtx.html