zoukankan      html  css  js  c++  java
  • django学习第87天form组件进阶.cookie.session.Auth模块

    一.forms组件

            1 定义
                from django import forms
                from django.forms import widgets
                from django.core.exceptions import ValidationError
                # 2 写一个类
                class RegForm(forms.Form):
                    # 3 写属性
                    name=forms.CharField(max_length=8,min_length=3,label='用户名',error_messages={'max_length':'超长了'},
                                         widget=widgets.TextInput(attrs={'class':'form-control'})
                                         )
                    
                    # 4 局部钩子函数
                    def clean_name(self):
                        name=self.cleaned_data.get('name')
                        if name.startswith('sb'):
                            raise ValidationError('不能以sb开头')
                        else:
                            # 切记,如果正确,一定要返回name
                            return name
                        
                    # 5 全局钩子函数
                    def clean(self):
                        #一系列逻辑判断
                        #如果校验通过:返回cleaned_data
                        #如果校验不通过:raise ValidationError('两次密码不一致'),错误放到__all__

                         def clean(self):
                            pwd=self.cleaned_data.get('pwd')
                            re_pwd=self.cleaned_data.get('re_pwd')
                            if pwd==re_pwd:
                           # 正确,返回self.cleaned_data
                               return self.cleaned_data
                            else:
                           # 校验失败,抛异常
                               raise ValidationError('两次密码不一致')

            2 views中使用:
                def test(request):
                    if request.method=='GET':
                        regform=RegForm()
                    else:
                        regform=RegForm(request.POST)
                        if regform.is_valid():
                            #一般情况需要存数据库了
                            pass
                        else:
                            error_all=regform.errors.get('__all__')
                            # error_all=regform.errors['__all__']
                    return render(request,'register.html',locals())
            3 模板中使用
                <form action="">
    
                {% for foo in regform %}
                    {{ foo.label }}:{{ foo }} <span>{{ foo.errors.0 }}</span>
                {% endfor %}
                <input type="submit"> <span>{{ error_all }}</span>
    
                </form>

    二.cookie和session

      

            1 cookie:由服务器产生,存放在客户端浏览器上的键值对
            2 django中使用cookie:
                -设置值:
                    obj=HttpResponse('ok')
                    obj.set_cookie('key','value',max_age=10)
                -取值:
                    request.COOKIES.get('key')
                    request.COOKIES['key']
                -删除值:
                    obj=HttpResponse('ok')
                    obj.delete_cookie('key')
                    
            3 session:保存在服务器上的键值对
                -设置值:
                    request.session['key']='value'
                    request.session['key1']='value1'
                    
                         1 生成一个随机字符串:dasfasdf
                         2 在django_session表中存入dasfasdf   {'key':'value','key1':value1}  超时时间
                         3 把sessionid:dasfasdf写入到cookie
                    
                -取值:
                    request.session.get('key')
                -删除值:
                    request.session.flush():全删除
                    request.session.delete():只删除数据库
                -其它配置参数:
                    了解
    1. 数据库Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)
    
    2. 缓存Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
    SESSION_CACHE_ALIAS = 'default'                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
    
    3. 文件Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
    SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 
    
    4. 缓存+数据库
    SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎
    
    5. 加密Cookie Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎
    
    其他公用设置项:
    SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
    SESSION_COOKIE_PATH = "/"                               # Session的cookie保存的路径(默认)
    SESSION_COOKIE_DOMAIN = None                             # Session的cookie保存的域名(默认)
    SESSION_COOKIE_SECURE = False                            # 是否Https传输cookie(默认)
    SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支持http传输(默认)
    SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(默认)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否关闭浏览器使得Session过期(默认)
    SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次请求都保存Session,默认修改之后才保存(默认)

    三.Auth模块

            1 Django自带的用户认证模块,可以快速的实现登录,注销,修改密码...
            2 扩展auth表,需要继承AbstractUser
             然后一定不要忘记在setting中配置:AUTH_USER_MODEL = "app名.UserInfo" 3 它提供的功能 -from django.contrib.auth import authenticate,login,logout -用户认证:user=authenticate(username=lqz,password=123) -用户一旦认证通过,调用login(request,user),以后从request.user中就能取出当前登录人对象 -退出:logout(request),request.user就是匿名用户 -校验是否通过认证(是否登录):request.user.is_authenticated() -创建普通用户 -models.UserInfo.objects.create_user(username=lqz) -创建超级用户 -models.UserInfo.objects.create_superuser(username=lqz) -修改密码 -用user对象.set_password(新密码) -一定要记住save -校验密码 -check_password(password) -登录认证装饰器(没有登陆的时候跳转) -login_required(login_url='/login/') -全局配置(在setting中配置): LOGIN_URL = '/login/' is_staff: 用户是否拥有网站的管理权限:create_superuser:is_staff是1 is_active: 是否允许用户登录, 设置为 False,可以在不删除用户的前提下禁止用户登录
    
    
    扩展auth表,需要继承AbstractUser
    from django.contrib.auth.models import AbstractUser
    class UserInfo(AbstractUser):
        """
        用户信息表
        """
        nid = models.AutoField(primary_key=True)
        phone = models.CharField(max_length=11, null=True, unique=True)
        
        def __str__(self):
            return self.username
  • 相关阅读:
    上市前为什么要分红
    在文件开始追加一行
    c++ 日期时间工具
    windows c++找不到time.h sys/types.h
    截取ls -l的某一列
    提取指定类型文件到指定目录,保留目录结构
    批量转换当前目录下的文件名为snake case
    vcpkg boost uuid Bcrypt 链接问题
    文件名pascal转underscore
    vcpkg cmake 找不到boost
  • 原文地址:https://www.cnblogs.com/ye-hui/p/10309283.html
Copyright © 2011-2022 走看看