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
原文地址:https://www.cnblogs.com/ye-hui/p/10309283.html