zoukankan      html  css  js  c++  java
  • 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>
    
  • 相关阅读:
    《程序猿闭门造车》之NBPM工作流引擎
    CryptographicException异常处理方法
    nodejs简单模仿web.net web api
    Windows Mobile设备操作演示准备工作小记
    PPT定时器小记
    winDBG排错小记
    Ubuntu 16.04应用布署小记
    Ubuntu 16.04环境布署小记
    Ubuntu 16.04系统布署小记
    Dokuwiki布署小记
  • 原文地址:https://www.cnblogs.com/cainiaoqianxun/p/13262837.html
Copyright © 2011-2022 走看看