Django中的表单数据处理——HttpRequest的对象,GET和POST请求,CSRF

1、Django中的HttpRequest的对象

  • 什么是HttpRequest
    • ①HttpRequest,请求对象,封装了请求过程中所有的信息
    • ②在Django中,HttpRequest被演变成了request封装到视图(views)处理函数中的作为参数,该参数,在调用视图处理函数时自动传参
    # views.py
    def dir_request_views(request):
        request_list = dir(request)
        return render(request, 'request_list.html', locals())
    
    <!--request_list.html-->
    <body>
    	<!--查看request 的 全部属性和方法-->
        {% for i in request_list %}
            <P>属性或函数名:{{ i }}</P>
        {% endfor %}
    </body>
    
    • ③HttpRequest中的主要内容
      • request.scheme:请求协议(http/https)
      • request.body:请求主体
      • request,path:请求路径
      • request.get_host():请求的主机地址或域名
      • request.method:请求方法(POST/GET)——常用
      • request.GET:get的请求数据——常用
      • request.POST:post的请求数据——常用
      • request.COOKIES:cookies的数据——常用
      • request,META:请求的元数据
    # views.py
    def dir_request_views(request):
        scheme = request.scheme
        body = request.body
        path = request.path
        host = request.get_host()
        method = request.method
        get = request.GET
        post = request.POST
        cookie = request.COOKIES
        meta = request.META
        return render(request, 'request_list.html', locals())
    
    <!--request_list.html-->
    <body>
    	<!--查看request 的 主要内容-->
        <p>请求协议:{{ scheme }}</p>
        <p>请求主体:{{ body }}</p>
        <p>请求路径:{{ path }}</p>
        <p>请求主机地址:{{ host }}</p>
        <p>请求方法:{{ method }}</p>
        <p>get的数据:{{ get }}</p>
        <p>post的数据:{{ post }}</p>
        <p>cookie数据:{{ cookie }}</p>
        <p>元数据:{{ meta }}</p>
    </body>
    

2、Http协议中get和post请求

  • 1、每个请求一定都会有请求方方式,最常见的为get和post,不常见的有put,delete等
    • ①get:向服务器索取数据时使用
      • 传递数据到服务器时,会直接请求数据封装到地址的后面,在url中会显示get的数据
      • ex :”http://www.baidu.com/s?wd=北京&d=海淀”,请求地址为“ http://www.baidu.com/s ”,get参数为“ ?wd=北京&d=海淀 ”
    • ②post:,要传递数据到服务器处理时使用
      • post请求提交的数据全部封装在请求主体中,在url中不显示
      • 主要用在登录或注册时使用
  • 2、请求主体
    • 只有post 和 put 请求方法才能产生请求主体,其他请求方式都没有请求主体

3、获取请求提交的数据

  • 1、GET请求
    • request.GET[‘名称’]
# views.py
def show_get_views(request):
    method = request.method
    get = request.GET
    if 'name' in get:
        name = get['name']
    if 'age' in get:
        age = get['age']
    return render(request, 'get.html', locals())
<!--get.html-->
<!--url:http://127.0.0.1:8000/get/?name=sam&age=28-->
<body>
    <p>请求方法:{{ method }}</p>   <!--请求方法:GET-->
    <p>get数据:{{ get }}</p>  <!--get数据:<QueryDict: {'age': ['28'], 'name': ['sam']}>-->
    <p>name:{{ name }}</p>  <!--name:sam-->
    <p>age:{{ age }}</p>  <!--age:28-->
</body>
  • 2、POST请求
    • request.POST[‘名称’]
# views.py
def login_views(request):
    # 判断是get还是post的请求
    if request.method == 'GET':
        return render(request, 'login.html')
    else:
        if 'uname' in request.POST:
            uname = request.POST['uname']
        if 'upwd' in request.POST:
            upwd = request.POST['upwd']
        return HttpResponse(uname + upwd)
# urls.py
urlpatterns = [
    url(r'^login/$', login_views, name='login'),
]

4、CSRF 跨站点攻击

  • 1、目的是为了解决跨站点发送POST请求
  • 2、解决方案
    • ①删除 CsrfViewMiddleware中间件
      • 中间件位置在settings.py文件中MIDDLEWARE里边内
      • 不推荐使用,此方案会降低安全级别,任何跨站点的数据均可以提交给服务器
    • ② 在视图函数上增加一个装饰器,@csrf_project
      • 不推荐使用,此方案默认将所有跨站点数据均视为合法数据提交给服务器
    • ③ 在模板中 form 表单下面第一行增加一个标签 {% csrf_token %}
<!--login.html-->
<body>
    <form action="{% url 'login' %}" method="post">  <!--通过别名提交post数据-->
    	{% csrf_token %}
        <p>
            用户名:
            <input type="text" name="uname">
        </p>
        <p>
            用户密码:
            <input type="password" name="upwd">
        </p>
        <p>
            <input type="submit" value="登录">
        </p>
    </form>
</body>
发布了75 篇原创文章 · 获赞 87 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43883022/article/details/102542030
今日推荐