zoukankan      html  css  js  c++  java
  • django中的认证与登录

    认证登录

    django.contrib.auth中提供了许多方法,这里主要介绍其中的三个:

      1  authenticate(**credentials)    提供了用户认证,即验证用户名以及密码是否正确

        一般需要username  password两个关键字参数

        如果认证信息有效,会返回一个  User  对象。authenticate()会在User 对象上设置一个属性标识那种认证后端认证了该用户,且该信息在后面的登录过程中是需要的。当我们试图登陆一个从数据库中直接取出来不经过authenticate()的User对象会报错的!!

    user = authentica(username='someone',password='somepassword')

      2  login(HttpRequest, user, backend=None)  

        该函数接受一个HttpRequest对象,以及一个认证了的User对象

        此函数使用django的session框架给某个已认证的用户附加上session id等信息。

    from django.contrib.auth import authenticate, login
    
    def my_view(request):
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(username=username, password=password)
        if user is not None:
            login(request, user)
            # Redirect to a success page.
            ...
        else:
            # Return an 'invalid login' error message.
            ...

      3  logout(request)     注销用户

    from django.contrib.auth import logout
    
    def logout_view(request):
        logout(request)
        # Redirect to a success page.

        该函数接受一个HttpRequest对象,无返回值。

        当调用该函数时,当前请求的session信息会全部清除

        该用户即使没有登录,使用该函数也不会报错

    只允许登录的用户访问

    如果希望:

      1  用户登陆后才能访问某些页面,

      2  如果用户没有登录就访问该页面的话直接跳到登录页面

      3  用户在跳转的登陆界面中完成登陆后,自动访问跳转到之前访问的地址

    我们有几个方法来实现:

    1  糙活

      检测request.user.is_authenticated()

    from django.conf import settings
    from django.shortcuts import redirect
    
    def my_view(request):
        if not request.user.is_authenticated():
            return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

    2  django中的login_required函数

    django已经为我们设计好了一个用于此种情况的装饰器:login_requierd()

    from django.contrib.auth.decorators import login_required  
         
    @login_required  
    def my_view(request):  
        ...  

    在运行my_view函数前需要进行登录验证。

      1  若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ' (这个值可以在settings文件中通过LOGIN_URL进行修改)。并传递  当前访问url的绝对路径 (登陆成功后,会重定向到该路径)。

        可以使用  login_url  参数来配置 登录url

        可以使用redirect_field_name参数配置 当前访问url的绝对路径

        如果要使用django的默认登陆界面,则可以通过在urls.py中如此配置,这样的话,如果未登录,程序会默认跳转到

         “templates egistrationlogin.html”这个模板。

    #urls.py
    ...
    (r'^accounts/login/$', 'django.contrib.auth.views.login'),

      2  如果用户登陆了,则会进入正常的页面

  • 相关阅读:
    Redis大集群扩容性能优化实践
    INET_ATON(expr)
    无类别域间路由 Classless Inter-Domain Routing CIDR 可变长子网掩码 VLSM Variable Length Subnet Mask
    把[]byte转成string
    不用 H5,闲鱼 Flutter 如何玩转小游戏?
    重度使用Flutter研发模式下的页面性能优化实践
    Flutter 打包与转译 编译 Flutter 即将占领整个 Web 开发
    interface {} is uint, not []uint8
    MySQL查看数据库性能常用命令_Running_Tiger的博客-CSDN博客_mysql 查看数据库 https://blog.csdn.net/qq_41455420/article/details/82802090
    vivo全球商城时光机
  • 原文地址:https://www.cnblogs.com/MnCu8261/p/5904175.html
Copyright © 2011-2022 走看看