zoukankan      html  css  js  c++  java
  • Django之请求及响应篇

    HttpRequest对象

    服务器接收到http协议的请求后,会根据报文创建HttpRequest对象视图函数的第一个参数是HttpRequest对象在django.http模块中定义了HttpRequest对象的API

    属性及方法:

    属性:
    path:一个字符串,表示请求的页面的完整路径,不包含域名
    method:一个字符串,表示请求使用的HTTP方法,常用值包括:'GET'、'POST'
    encoding:一个字符串,表示提交的数据的编码方式
    如果为None则表示使用浏览器的默认设置,一般为utf-8
    这个属性是可写的,可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encodingGET:一个类似于字典的对象,包含get请求方式的所有参数
    POST:一个类似于字典的对象,包含post请求方式的所有参数
    FILES:一个类似于字典的对象,包含所有的上传文件
    COOKIES:一个标准的Python字典,包含所有的cookie,键和值都为字符串
    session:一个既可读又可写的类似于字典的对象,表示当前的会话,只有当Django 启用会话的支持时才可用,详细内容见“状态保持”
    方法:
    is_ajax():如果请求是通过XMLHttpRequest发起的,则返回True

    QueryDict对象

    request对象的属性GET、POST都是QueryDict类型的对象

    python字典不同,QueryDict类型的对象用来处理同一个键带有多个值的情况

    • 方法get():根据键获取值

      只能获取键的一个值

      如果一个键同时拥有多个值,获取最后一个值

    • 方法getlist():根据键获取值

      将键的值以列表返回,可以获取一个键的多个值

    dict.get('键',default)  或简写为   dict['键']
    dict.getlist('键',default)
    GET属性
    • QueryDict类型的对象
    • 包含get请求方式的所有参数
    • 与url请求地址中的参数对应,位于?后面
    • 参数的格式是键值对,如key1=value1
    • 多个参数之间,使用&连接,如key1=value1&key2=value2
    POST属性
    • QueryDict类型的对象
    • 包含post请求方式的所有参数
    • 与form表单中的控件对应
    • 表单中控件要有name属性,则name属性的值为键,value属性的值为键,构成键值对提交
    • 对于checkbox控件,name属性一样为一组,当控件被选中后会被提交,存在一键多值的情况

    HttpResponse对象

    django.http模块中定义了HttpResponse对象的API

    属性及方法:

    属性:
    content:表示返回的内容,字符串类型
    charset:表示response采用的编码字符集,字符串类型
    status_code:响应的HTTP响应状态码
    方法:
    init :使用页内容实例化HttpResponse对象
    write(content):以文件的方式写
    flush():以文件的方式输出缓存区
    set_cookie(key, value='', max_age=None, expires=None):设置Cookie
    key、value都是字符串类型
    max_age是一个整数,表示在指定秒数后过期
    expires是一个datetime或timedelta对象,会话将在这个指定的日期/时间过期,注意datetime和timedelta值只有在使用PickleSerializer时才可序列化
    max_age与expires二选一
    如果不指定过期时间,则关闭浏览器就失效.
    delete_cookie(key):删除指定的key的Cookie,如果key不存在则什么也不发生
    有关于cookie的例子
    # ts11/views.py
    def ckTest(request):
        response = HttpResponse('设置/获取/删除cookie')
        # response.set_cookie('a','123') 在响应里面设置
        cookie = request.COOKIES   # 在请求里面  获取cookie
        a = cookie.get('a',None)
        response.write(a)
        # rs.delete_cookie('a')
        # return rs
        return response
    # 注意:设置cookie值以及删除cookie值都是response对象的操作,
    # 而获取cookie是从requeset相应中获得的.

    HttpResponse的子类

    JsonResponse:返回json数据,

    • 帮助用户创建JSON编码的响应
    • 参数data是字典对象
    • JsonResponse的默认Content-Typeapplication/json
    from django.http import JsonResponse
    
    def jpTest(request):
        return JsonResponse({'xx':'12345'})
    简写函数:

    render : 模板渲染

    redirect:重定向,服务器端跳转,结合reverse方法使用。

    状态保持

    • http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状态
    • 客户端与服务器端的一次通信,就是一次会话实现状态保持的方式:在客户端或服务器端存储与会话有关的数据
    • 存储方式包括cookie、session,会话一般指session对象
    • 使用cookie,所有数据存储在客户端,注意不要存储敏感信息
    • 推荐使用sesison方式,所有数据存储在服务器端,在客户端cookie中存储session_id
    • 状态保持的目的是在一段时间内跟踪请求者的状态,可以实现跨页面访问当前请求者的数据
    • 注意:不同的请求者之间不会共享这个数据,与请求者一一对应
    启用session

    settings.py文件中

    项INSTALLED_APPS列表中添加:
    'django.contrib.sessions',
    
    项MIDDLEWARE_CLASSES列表中添加:
    'django.contrib.sessions.middleware.SessionMiddleware',
    使用session
    • 启用会话后,每个HttpRequest对象将具有一个session属性,它是一个类字典对象
    • get(key, default=None):根据键获取会话的值
    • clear():清除所有会话
    • flush():删除当前的会话数据并删除会话的Cookie
    • del request.session[‘member_id’]:删除会话
    用户登录例子
    #------------view.py--------------
    from django.shortcuts import render,reverse,redirect
    from django.http import HttpResponse
    
    def home(request):
        username = request.session.get('username','未登录')
        return render(request,'home.html',
                      {'username':username})
    
    def login(request):
        if request.method == 'GET':
            return render(request,'login.html')
        elif request.method == 'POST':
            username = request.POST.get('username')
            request.session['username']=username
            return redirect(reverse('ts11_home'))
    
    def logout(request):
        # request.session['username'] = None
        # del request.session['username']
        # request.session.clear()
        request.session.flush()
        return redirect(reverse('ts11_home'))
    
    
    #--------urls.py--------------
    from django.conf.urls import url
    from . import views  
    urlpatterns = [    
        url(r'^home/$',views.home,name='ts11_home'),
        url(r'^login/$',views.login,name='ts11_login'),
        url(r'^logout/$',views.logout,name='ts11_logout'),
    ]
    
    #--------home.html---------
    <body>
    你好!{{ username }} <br>
    <a href={% url 'ts11_login' %}>登录</a>
    <a href={% url 'ts11_logout' %}>退出</a>
    </body>
    
    #-------login.html--------
    <form method="post" >
        {% csrf_token %}
        <input type="text" name="username"/>
        <input type="submit" value="登录"/>
    </form>
    </body> 
    会话过期时间
    • set_expiry(value):设置会话的超时时间
    • 如果没有指定,则两个星期后过期
    • 如果value是一个整数,会话将在values秒没有活动后过期
    • 若果value是一个imedelta对象,会话将在当前时间加上这个指定的日期/时间过期
    • 如果value为0,那么用户会话的Cookie将在用户的浏览器关闭时过期
    • 如果value为None,那么会话永不过期
    #------------view.py--------------
    def login(request):
        if request.method == 'GET':
            return render(request,'login.html')
        elif request.method == 'POST':
            username = request.POST.get('username')
            request.session['username']=username
            request.session.set_expiry(0)  #关闭浏览器就过期
            return redirect(reverse('ts11_home'))

    setting文件中的配置:

    # 是否关闭浏览器使得Session过期,默认是False
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False   
    
    #是否每次请求都保存Session,默认修改之后才保存
    SESSION_SAVE_EVERY_REQUEST = False
    
    # Session的cookie失效日期,默认是2周
    SESSION_COOKIE_AGE = 1209600
  • 相关阅读:
    Windows环境下阿里云添加SSH Key及Git配置Key
    Shiro自定义注解扩展@SalmonRequiresPermission
    windows下安装redis
    模型-视图-控制器的C++解释
    CentOS 7 搭建 GitLab
    博客园主题分享——绿色
    2019年的第一篇博客
    Qt——线程与定时器
    Qt——线程类QThread
    QML——添加自定义模块
  • 原文地址:https://www.cnblogs.com/shuai06/p/12397525.html
Copyright © 2011-2022 走看看