zoukankan      html  css  js  c++  java
  • 29 Jun 18 Django,auth

    29 Jun 18

    一、内容回顾

    1. VUE (一套用于构建用户界面的渐进式框架)

       VUE: https://cn.vuejs.org/v2/guide/

       VUE ROUTER: https://cn.vuejs.org/v2/guide/

       VUEX: https://vuex.vuejs.org/zh/

     

    2. Refresh(小圆圈)和重输URL的区别:

       Refresh: 重新提交请求

       重输URL:重新获取html

     

    3. validators 为一个列表,可混用校验函数和正则表达,如下

       validators=[zhangzhao, RegexValidator(r'^1[356789][0-9]{9}$', "手机格式不正确"),...]

     

    4. 校验:先走各字段内置的校验,再走各字段自定义的校验(局部钩子),最后走全局钩子clean的校验

     

     

    5. 可以将创建的form表单类,放到单独的py文件中,至于app下。使用前导入

       from app01 import forms.py

     

    6. 作业讲解(基于Bootstrap的注册页面)

       a. 导入bootstrap css

          <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css">

          

       b. 设置居中

          <div class="container">

            <div class="row">

              <div class="col-md-6 col-md-offset-3">

              </div>

            </div>

           </div>

           

       c. <form class="form-horizontal" novalidateaction="/register/" method="post" autocomplete="off">

          1) novalidate # 取消浏览器自动校验

          2) autocomplete="off"  # 取消历史数据以下拉框显示

       

       d. 一个字段

          <div class="form-group">

              <label for="{{ user_obj.uname.id_for_label }}" class="col-sm-2 control-label">{{ user_obj.uname.label }}</label>

              <div class="col-sm-10">

                   {{ user_obj.uname }}

                   <span class="help-block">{{ user_obj.uname.errors.0 }}</span>

              </div>

          </div>

          

          # for="{{ user_obj.uname.id_for_label }}" :不确定{{ user_obj.name }}的id是什么,在label中使用上述方法以锁定对应的input

       

       e. 单选/多选  

                 <div class="form-group">

                        <div class="col-sm-2 control-label" style="font-weight: 700;padding-top: 14px">{{ user_obj.hobby.label }}</div>

                        <div class="col-sm-10 checkbox-inline">

                            {% for checkbox in user_obj.hobby %}

                               <label class="checkbox-inline">

                                   {{ checkbox }}

                               </label>

                            {% endfor %}

                           <span class="help-block">{{ user_obj.hobby.errors.0 }}</span>

                       </div>

                  </div>

           

           # checkbox-inline/ radio-inline

       

       f. 将要用的class和placeholder通过后端传入

    widget=forms.widgets.TextInput(attrs={"class": "form-control", "placeholder": 'username'}

       

       g. 设置没有选项被选中时不报错

          required=False

     

    二、今日内容(Django内置的认证系统)

    https://www.cnblogs.com/liwenzhou/p/9030211.html

     

     

    1. 调用内置的创建用户的方法,内置的auth使用的ORM类User,创建用户

       # 操作这个类的对象,只能用auth提供的接口(密码自动加密,加密算法未知)

       a. 创建一个普通用户

       from django.contrib.auth.models import User

       User.objects.create_user(username=username, password=pwd)

     

       b. 创建一个super用户

       1)User.objects.create_superuser((username=u, password=p,email='em@1.com'))

       2)Run manage.py Task: createsuperuser# 用此种方式,只能创建superuser

     

    2. 调用内置的验证用户的方法,验证用户名和密码是否正确

       from django.contrib import auth

       user_obj = auth.authenticate(username=username, password=pwd)

     

       a. 验证成功,user_obj, type(user_obj)  # zyq <class 'django.contrib.auth.models.User'> 内置类的对象

     

       b. 验证失败user_obj, type(user_obj) # None <class 'NoneType'>

     

    3. 调用内置的登录方法, 生成Session数据,存一下user_id,然后把sessionid写入Cookie。后续每一次请求来的时候,AuthenticationMiddleware中的process_request方法中会取到user_id,进而取到user对象,然后添加到request.user属性中(request.user = user)。

    后续我们可以通过request.user拿到当前的登陆用户对象  

    # <h1>Hello,{{ request.user.username }}</h1>

     

     

       from django.contrib import auth

       auth.login(request, user_obj)

     

    4. 调用auth内置的注销方法,注销对象

       # 该用户即使没有登录,使用该函数也不会报错(源码:匿名用户)

       from django.contrib import auth

       auth.logout(request)

     

    5. 调用auth内置的装饰器login_required,强制登陆

       from django.contrib.auth.decorators import login_required

       @login_required

       def home(request):

           pass

     

       # 若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ' 并传递当前访问url的绝对路径(登陆成功后,会重定向到该路径)。

      

         如果需要自定义登录的URL,则需要在settings.py文件中通过LOGIN_URL进行修改。(如下)

     

    6. 于settings.py中设置网站的默认的登录页面

       LOGIN_URL = "/login/"

     

    7. 检查密码是否正确

       from django.contrib import auth

       user_obj = request.user

       user_obj.check_password(原密码)

     

    8. 修改密码

       from django.contrib import auth

       user_obj.set_password(新密码)

       user_obj.save() # 一定记得修改完要保存

     

    9. 扩展:为默认auth默认User类添加新字段

       于app01的models:

       from django.contrib.auth.models import AbstractUser

       class ABC(AbstractUser):

           phone = models.CharField(max_length=11)

     

       于settings.py:

       AUTH_USER_MODEL = "app01.UserInfo"

     

       于views.py导入:

       from app01.models import UserInfo

     

       # 一旦指定了新的认证系统所使用的表,需要重新在数据库中创建该表,而不能继续使用原来默认的auth_user表了。

     

    10. 于settings.py中设置语言

       a. LANGUAGE_CODE = 'en-us'

       b. LANGUAGE_CODE = 'zh-hans'

     

    11. 看源码:

       _  :翻译

       assert :断言的用法

       匿名用户: 使得返回值为空,不报错

     

    12. 判断当前请求是否通过认证

        def my_view(request):

        if not request.user.is_authenticated():

            return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

  • 相关阅读:
    hdu 4033Regular Polygon(二分+余弦定理)
    hdu 4405Aeroplane chess(概率DP)
    hdu 3853LOOPS (概率DP)
    网络编程基础(转)
    网络编程socket基本API详解(转)
    网络编程之socket(转)
    cf(#div1 B. Dreamoon and Sets)(数论)
    cf(#div1 A. Dreamoon and Sums)(数论)
    hdu 1805Expressions(二叉树构造的后缀表达式)
    hdu1710(Binary Tree Traversals)(二叉树遍历)
  • 原文地址:https://www.cnblogs.com/zhangyaqian/p/py20180629.html
Copyright © 2011-2022 走看看