美文网首页
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