您当前的位置: 首页 >  django
  • 2浏览

    0关注

    214博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Django(五):请求的响应码+请求的方法+form表单类+csrf

不愿透露姓名の网友 发布时间:2019-09-17 22:39:30 ,浏览量:2

文章目录
  • 一、认识http请求
    • 1.请求的方式
    • 2.常见的响应码
    • 3.请求request对象的方法
    • 4.Django中get 和post请求获取参数的方式
  • 二、Django的form表单请求
    • 1.form表单简介
    • 2.Django中form表单的get请求
    • 3.form表单post请求
      • 3.1 CSRF
      • 3.2POST请求
  • 三、Django中使用POST完成用户注册
  • 四、django form 表单类
      • 1. 定义form表单类
      • 2. 使用form表单类
      • 3. 修改table样式
      • 4. 使用form表单类进行后端验证

一、认识http请求

可见这篇了解http:https://blog.csdn.net/qq_40558166/article/details/102770867

1.请求的方式

get

https://www.baidu.com/s?wd=world&name=zhangsan

- 该请求即为get请求,get请求是web中使用最频繁的请求方式。一般是像服务器请求资源。
- 从?后开始,是参数(key=value的形式),以&符号进行区分,这个请求中携带了几个参数分别为wd和name
- 缺点:参数写在url中是不安全的,而且url长度是有限的,携带的参数数据有限

post

- 一般是向服务器提供资源。
- post请求的样式和get请求的样式相同,同时还可以把参数写在请求体当中,这样更加安全隐蔽,安全性比get高,而且传输的数据量也比较大

其他请求方式

Delete
options
put
patch
2.常见的响应码

用上述的请求服务器,会接收服务器的响应,响应码可以更好的识别我们的请求是否成功。常见的响应码如下 在这里插入图片描述

3.请求request对象的方法 方法意义request.COOKIES用户身份 *****request.FILES请求携带的文件,比如图片 ****request.GETget请求携带的参数 *****request.POSTpost请求携带的参数 *****request.schemehttps还是http ****request.method请求的方式 *****request.path请求的路径 ***request.body请求的主体,返回的是一个字符串 ***request.META包含了具体的请求数据,包含所有的http请求的信息信息request.META.get(‘OS’)请求的系统request.META.get(‘HTTP_USER_AGENT’)发出请求的浏览器的版本request.META.get(‘HTTP_HOST’)请求的主机request.META.get(‘HTTP_REFERER’)请求的来源
def reqtest(request):
    # 获取get请求的参数
    data=request.GET
    # 获取post请求的参数
    data = request.POST
    print(data)  # 查看post携带的参数
    print(data.get('name'))  # 获取地址栏的键值为name的值
    print(request.COOKIES)  # 用户的身份
    print(request.scheme)  # https还是http
    print(request.method)  # 查看请求的方式
    print(request.path)  # 查看请求的路径
    print(request.body)  # 查看请求的主体,返回一个字符串
    print(request.META)  # 包含了具体的请求数据,包含所有的http请求的信息信息
    print(request.META.get('OS'))  # 请求的系统
    print(request.META.get('HTTP_USER_AGENT'))  # 发出请求的浏览器的版本
    print(request.META.get('HTTP_HOST'))  # 请求的主机
    print(request.META.get('HTTP_REFERER'))  # 请求的来源

    return HttpResponse('请求测试')

结果: 在这里插入图片描述 在这里插入图片描述

4.Django中get 和post请求获取参数的方式
def reqtest(request):
    ## 获取get请求传递的参数
    # data = request.GET
    ## 获取post 的请求参数
    data = request.POST
    print (data)
    print (data.get("name"))
    print (type(data.get("name")))
    print (data.get("age"))
    return HttpResponse("姓名:%s年龄%s" %(data.get("name"),data.get("age")))

发送post请求的时候,会报403(csrf)解决方案:在settings文件的中间件中将csrf验证注掉(django自动开启了csrf验证) 在这里插入图片描述 传入数据 在这里插入图片描述

二、Django的form表单请求 1.form表单简介

form是我们创建一个表单域,例如一个个人简介的信息表单,然后我们可以把整个表单提交到某个服务器。

参数:

  • action 提交的地址
  • method 提交的方式 get post
2.Django中form表单的get请求
  • templates中创建html ,创建form标签
  • 视图文件 接收请求 ,处理请求,返回响应
  • 路由文件绑定路由 在这里插入图片描述
3.form表单post请求 3.1 CSRF

​ 跨站请求伪造攻击,使用当前浏览器还在生效的cookie对指定网站进行操作,最初针对的是银行系统。 [外链图片转存失败(img-aUVi0IPw-1568730338061)(day07.assets/1568719297002.png)]

CSRF 的过程

[外链图片转存失败(img-coHUFg7P-1568730338062)(day07.assets/1568701219828.png)]

3.2POST请求
  • django本身提供对csrf的校验功能,在django 1.4 版本之前 是需要手动开启
  • 在django的所有的post请求,都会在请求之初,给用户下发一个串用来校验身份的编码,并且每次请求下发的串都不一样,django的csrf 只针对post请求

django当中使用csrf的步骤:

1. 在settings文件中打开csrf相关验证

2. 在视图中返回页面,需要使用render(render_to_response),render第一个参数 是请求对象(request)如果不返回这个request,前端没法使用{% csrf_token %}

3. 在模板中的form表单域中添加   {%  csrf_token %} 这个标签实际上 隐藏域,
   ​	name是 csrfmiddlewaretoken    
   ​	value是  csrf 校验的值

[外链图片转存失败(img-nz8PY9jb-1568730338063)(day07.assets/1568703020767.png)] html页面 [外链图片转存失败(img-QLvP1ell-1568730338064)(day07.assets/1568703139262.png)]

三、Django中使用POST完成用户注册

目标: 通过前端提交用户名,密码,后端收到数据,保存数据库

1. model中完成模型的创建 创建一个user表,字段 :用户名,密码 [外链图片转存失败(img-USHKBIgk-1568730338065)(day07.assets/1568703822182.png)] 再进行数据迁移:

python manage.py makemigrations
python manage.py migrate

2. 模板

form表单,post请求 [外链图片转存失败(img-68bedfLy-1568730338066)(day07.assets/1568704682336.png)]

3. 视图

接收post请求参数,写库

def register(request):
       if request.method == "POST":
           #  获取用户输入的数据
           username = request.POST.get("username")
           password= request.POST.get("password")
           password2 = request.POST.get("password2")
           ## 判断是否有数据
           content = "参数不全"
           if username and password2 and password:
               ## 判断密码是否相等
               if password != password2:
                   # return  ''
                   print ("两次密码不一样")
                   content="两次密码不一样"
               else:
                   ## 保存数据
                   user = User()
                   user.name = username
                   user.password = password
                   user.save()
                   content = "添加成功"
       return render(request,"register.html",locals())

4.md5进行密码加密

为了密码不泄露,我们使用md5 [外链图片转存失败(img-5MIbJdqY-1568730338067)(day07.assets/1568706662758.png)] [外链图片转存失败(img-3Vnb4vGb-1568730338068)(day07.assets/1568706810960.png)]

四、django form 表单类

表单功能在实际开发中,对数据的校验,获取数据。所谓数据的校验:包括对数据的长度,数据类型,是否为空,是否符合格式。针对数据的校验:前端校验,后端校验。

例如:用户名中长度的限制、特殊字符、用户名是否存在等等。

  • 前端校验
    • 通过js或者jq脚本对form表单提交的数据进行校验,
    • 优点: 形象,直观,减少服务器压力,有利于对用户提醒,用户体验比较好
  • 后端校验
    • 在视图当中,对要存储的数据进行校验,需要后端编写
    • 优点:安全性高,
    • 缺点: 服务器压力大,比较复杂

django前端校验可以通过校验框架进行校验,django推出form表单类来进行校验

1. 定义form表单类

跟模型类相似

[外链图片转存失败(img-YPBMDLsd-1568730338069)(day07.assets/1568708676018.png)]

2. 使用form表单类

[外链图片转存失败(img-YLpsmtBM-1568730338070)(day07.assets/1568709602637.png)]

form表单类是django定义的,可以自动生成前端form表单代码的一个表单类,已完成大部分校验功能。

常见的样式:

[外链图片转存失败(img-hMopMsvz-1568730338071)(day07.assets/1568710006494.png)]

table样式: ​ as_table被闲置,样式跟普通的样式一样,以前的布局使用table布局,现 在用的 div布局。table没有任何样式

3. 修改table样式

​ django提供的form表单类中只提供了样式,没有form表单域,也没有提交按钮,优点:方便开发人员修改样式。如果要提交,外面包围一个form表单

自定义table样式

    
    {% csrf_token %}
    
        {% for one in regiter_form %}
        
            
                {{ one.label }}
            
            
                {{ one }}
            
        
        {% endfor %}
    
        
            
        
    
    
    



修改视图

def register(request):
    regiter_form = Register()   ## 创建一个form表单类的实例对象
    if request.method == "POST":
        #  获取用户输入的数据
        # username = request.POST.get("username")
        username = request.POST.get("name")
        password= request.POST.get("password")
        ## 判断是否有数据
        content = "参数不全"
        if username and password:
            user = User()
            user.name = username
            ## 加密密码
            user.password = setPassword(password)
            user.save()
            content = "添加成功"
    return render(request,"register.html",locals())

使用form表单类进行数据的校验通过字段属性进行校验

max_length   最大长度
min_length   最小长度
required=True  是否允许为空,默认为True,不可为空
label    form表单类的标签的内容
help_text   帮助文档,有的浏览器显示不出来

form表单类,虽然能够完成前端校验,但是不用,form类经常被用来做后端校验

4. 使用form表单类进行后端验证
  1. 模板
   
   
   
       
       注册
   
   
   
   
       {% csrf_token %}
       {% for one in regiter_form %}
           
               {{ one.label }}
               {{ one }}
           
   
       {% endfor %}
       
           
       
   
   
   
   
   {{ error }}
   
   
   
  1. 视图
   ## 使用form表单进行验证 后端验证
   ## 验证用户名是否包含 特殊字符  admin
   def register(request):
       regiter_form = Register()   ## 创建一个form表单类的实例对象
       error = ""
       if request.method == "POST":
           data = Register(request.POST)  ## 将post请求传递过来的数据,交给 form表单类进行校验
           if data.is_valid():   ## 判断校验是否通过,  如果通过 返回一个True 否则 是Flase
               clean_data = data.cleaned_data   ### 返回一个字典类型,数据通过校验的数据
               ## 获取到数据,写库
               username = clean_data.get("name")
               password = clean_data.get("password")
               user = User()
               user.name = username
               ## 加密密码
               user.password = setPassword(password)
               user.save()
               error = "添加数据成功"
           else:
               error = data.errors
               print (error)
       return render(request,"register.html",locals())
  1. form表单类
 from django import forms
   
   class Register(forms.Form):
       ##
       name = forms.CharField(required=True,label="姓名")
       password = forms.CharField(max_length=8,min_length=6,label="密码")
   
       ## 固定写法
       def clean_name(self):
           """
           自定义校验    用户名不允许是admin
           """
           name = self.cleaned_data.get("name")
           if name == "admin":
               self.add_error("name","不可以是admin")
           else:
               return name

form表单类:

  1. 创建一个forms.py文件,定义一个form表单类,类名(随意), 字段(字段属性)跟models写法相同,需要判断哪个字段,表单类添加哪个字段, 通过字段属性做前端数据校验
  2. 写一个视图,返回一个摸板类的实例对象,这个对象实际上提供了form表单(但是没有form标签)
  3. 写一个模板使用for循环,循环form表单类,增加form标签,然后获取数据,进行提交
  4. 视图获取数据,进行校验 校验: 在form表单类中完成关于数据的校验 成功: 返回成功 失败:构建失败的提示,返回
关注
打赏
1657102503
查看更多评论
立即登录/注册

微信扫码登录

0.0363s