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>
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值