day80——基础知识复习4(django)

1. forms组件

  • 校验字段

    1. 写一个类(UserForm),继承Form
    2. 在类中写字段,pws = forms.CharField(max_length=32,min_length=4)
    3. 在视图函数中使用:form_ obj = UserForm(校验的字典)
    4. form.is_valid()通过了,就存起来(cleaned_data),不通过,form.errors会有错误信息
  • 默认的校验规还不够的话,需要中间写钩子函数,分为局部钩子和全局钩子两种

    • 局部钩子:

      def clean_字段名():
      	val = self.cleaned_data.get("name")  # val 就是要校验的字段,做限制
          if 条件:
          	不通过抛出raise ValidationError("该用户已注册!")
           return val  # 必须将勾出来的数据返回           
      
    • 全局钩子

      def clean(self):
          pwd=self.cleaned_data.get('pwd')
          r_pwd=self.cleaned_data.get('r_pwd')
          if pwd and r_pwd:
              if pwd==r_pwd:
                  return self.cleaned_data
              else:
                  raise ValidationError('两次密码不一致')
                  else:
                      return self.cleaned_data  # 全局钩子必须返回cleaned_data    
      

2. form组件源码执行流程

form.is_valid()——>内部起一个for循环,先去校验每个字段配置的规则,校验完成,走改字段的局部钩子函数,一个一个执行完(校验完)——>会走全局钩子(clean())——>self就会有clean_data和errors

流程:

  1. form.is_valid()

  2. self.erros

  3. self.full_clean()

  4. self.clean_fields() ——局部字段校验(自己的和局部钩子)

  5. self.clean_form()——全局钩子

    self._clean_fields()   局部字段的校验(自己的和局部钩子)
    	if hasattr(self, 'clean_%s' % name):
        	func=getattr(self, 'clean_%s' % name)
        	value = func()
        	self.cleaned_data[name] = value
        self._clean_form()     全局的钩子
        self._post_clean()
    

3. cookie与session组件

3.1.1 设置cookie

# 使用django放置cookie
response.set_cookie(key,value)  # HttpResonse(对象) render,JsonResponse,redirect
response.set_singned_cookie(key,value,salt='加密盐')

参数详解:

1 key, 键
2 value='', 值
3 max_age=None, 超时时间 cookie需要延续的时间(以秒为单位)如果参数是 None ,这个cookie会延续到浏览器关闭为止
4 expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)
5 path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问,浏览器只会把cookie回传给带有该路   径的页面,这样可以避免将cookie传给站点中的其他的应   用。
6 domain=None, Cookie生效的域名 你可用这个参数来构造一个跨站cookie。如,domain=".example.com"所构造的cookie对下面这些站点   都是可读的:www.example.com 、 www2.example.com 和an.other.sub.domain.example.com 。如果该参数设置为 None ,cookie只   能由设置它的站点读取
7 secure=False, 浏览器将通过HTTPS来回传cookie
8 httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)

3.1.2 删除cookie

response.delete_cookie("user")

3.1.3 获取cookie

request.COOKIE['key']  # request对象
reqeust.COOKIE.get('key')

3.2 session

#设置session
# 获取、设置、删除Session中数据
request.session['k1']
request.session.get('k1',None)
request.session['k1'] = 123
request.session.setdefault('k1',123) # 存在则不设置
del request.session['k1']


# 所有 键、值、键值对
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()

# 会话session的key
request.session.session_key

# 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()

# 检查会话session的key在数据库中是否存在
request.session.exists("session_key")

# 删除当前会话的所有Session数据(只删数据库)
request.session.delete()
  
# 删除当前的会话数据并删除会话的Cookie(数据库和cookie都删)。
request.session.flush() 
    这用于确保前面的会话数据不可以再次被用户的浏览器访问
    例如,django.contrib.auth.logout() 函数中就会调用它。

# 设置会话Session和Cookie的超时时间
request.session.set_expiry(value)
    * 如果value是个整数,session会在些秒数后失效。
    * 如果value是个datatime或timedelta,session就会在这个时间后失效。
    * 如果value是0,用户关闭浏览器session就会失效。
    * 如果value是None,session会依赖全局session失效策略。

4. 中间件

process_request(self,request)
	return response(不再往后走,直接就回去了)
	return None  会继续往后走
process_response(self, request, response)
	
	return response(否则报错)

# 进来的时候,从上往下执行
# 出的时候,从下往上

6. Auth模块

# 常用的方法
authenticate()
login(HttpRequest, user)
logout(request)
is_authenticated()
login_requierd()
create_user()
create_superuser()
check_password(password)
set_password(password)

# 扩展auth_user表
自己写一个类,继承AbstractUser,自己写扩展字段
在setting中配置:AUTH_USER_MODEL = "app名.UserInfo"

作业:

  1. 用ajax提交一个json格式数据,返回一个json格式数据,console.log打印出来

  2. 通过ajax上传一个文件并保存起来,前端接收到,弹窗说上传成功

  3. 用ajax提交用户的注册信息(用户名,密码,确认密码,年龄)(json),form组件做认证,姓名要大于4,小于16,不能以sb开头和结尾,用户名如果存在,也不能存进去,密码(最大16位,最小4位),年龄,小于150,大于18岁,密码和确认密码要一致,校验通过,存到user表中,

  4. 读一下forms执行流程

  5. 自己手动实现一个存文件的session,自定制一个session字典

作业 1 作业 2

路由:
url('^index/', views.index, name='index'),

视图:
def index(request):
    if request.is_ajax():
        if not request.FILES and request.body:
            byte_data = request.body
            print(json.loads(byte_data))
            return JsonResponse({'msg': 'ok'})
        file = request.FILES.get('myfile')
        file_name = file.name
        with open(file_name, 'wb') as f:
            for line in file:
                f.write(line)
        return JsonResponse({'msg': 'ok'})
    return render(request, 'index.html')

index.html

<script>
    $('#submit').click(function () {
        $.ajax({
            url: '',
            type: 'post',
            contentType: 'application/json',
            dataType: 'json',
            data: JSON.stringify({'username': 'tom', 'age': 18}),
            success: function (args) {
                console.log(args)
            }
        })
    })
    $('#submit_file').click(function () {
        let formData = new FormData()
        formData.append('myfile', $('#file')[0].files[0])
        $.ajax({
            url: '',
            type: 'post',
            contentType: false,
            processData: false,
            data: formData,
            success: function (args) {
                alert(args.msg)
            }
        })
    })
</script>

作业 3

# 路由
url('^register/', views.register)

# 视图
def register(request):
    form_obj = MyForm()
    if request.is_ajax():
        dic = {'code': 1000, 'msg': ''}
        user_data = json.loads(request.body)
        username = user_data.get('username')
        user_obj = models.UserInfo.objects.filter(username=username)
        if not user_obj:
            form_obj = MyForm(user_data)
            if form_obj.is_valid():
                user_data.pop('re_password')
                models.UserInfo.objects.create_user(**user_data)
                dic['msg'] = f'用户{request.POST.get("username")}注册成功'
            else:
                dic['code'] = 1001
                dic['msg'] = form_obj.errors
        else:
            dic['code'] = 1002
            dic['msg'] = f'用户{username}已经注册过了'
        return JsonResponse(dic)
    return render(request, 'register.html', locals())


# MyForm
class MyForm(forms.Form):
    username = forms.CharField(min_length=4, max_length=16, label='用户姓名',
                               error_messages={
                                   'min_length': '用户名最少四位',
                                   'max_length': '用户名最多十六位',
                                   'required': '用户名不能为空'
                               })
    password = forms.CharField(min_length=4, max_length=16, label='用户密码',
                               error_messages={
                                   'min_length': '密码最少四位',
                                   'max_length': '密码最多十六位',
                                   'required': '密码不能为空'
                               }
                               )
    re_password = forms.CharField(label='确认密码',
                                  error_messages={
                                      'required': '确认密码不能为空'
                                  })
    age = forms.IntegerField(label='用户年龄',
                             error_messages={
                                 'required': '年龄不能为空'
                             }
                             )

    def clean_username(self):
        username = self.cleaned_data.get('username')
        if username.startswith('sb') or username.endswith('sb'):
            self.add_error('username', '用户名不能以非法字母【sb】开头或结尾')
        return username

    def clean_age(self):
        age = self.cleaned_data.get('age')
        age = int(age)
        if age < 18 or age > 150:
            self.add_error('age', '本网站只允许大于18岁且小于150岁的人使用')
        return age

    def clean(self):
        pwd = self.cleaned_data.get('password')
        re_pwd = self.cleaned_data.get('re_password')
        if re_pwd != pwd:
            self.add_error('re_password', '两次输入的密码不一致')
        return self.cleaned_data

register.html:

<body>
<div class="row">
    <div class="col-md-8 col-md-offset-2">
        <h1 class="text-center"></h1>
        <form action="">
            {% for form in form_obj %}
                <p>{{ form.label }}:{{ form }}<span style="color:red"></span></p>
            {% endfor %}
            <input type="button" value="注册" id="submit">
        </form>
    </div>
</div>
<script>
    $('#submit').click(function () {
        let username = $('#id_username').val()
        let password = $('#id_password').val()
        let re_password = $('#id_re_password').val()
        let age = $('#id_age').val()
        let data = {
            'username': username,
            'password': password,
            're_password': re_password,
            'age': age
        }
        $.ajax({
            url: '',
            type: 'post',
            data: JSON.stringify(data),
            dataType: 'json',
            contentType: 'application/json',
            success: function (args) {
                if (args.code == 1000) {
                    alert(args.msg)
                }
                else if(args.code == 1002){
                    alert(args.msg)
                }
                else {
                    $.each(args.msg, function (key, error) {
                        let target_id = '#id_' + key
                        console.log(target_id)
                        $(target_id).next().text(error[0])
                    })
                }
            }
        })
        $('input').on('focus',function () {
            $(this).next().text('')
        })
    })
</script>
</body>
原文地址:https://www.cnblogs.com/zhangtieshan/p/13262837.html