django用户

提到开发,特别是对于那些动态网站,都会涉及到用户的一些信息,比如用户登录,传统的用户登录我们可以自定义,也可以自定义一些我们自己的规则,但是,一般情况下,我们都会用第三方封装好的或者web框架自带的,比如django的auth,使用方法如下

from django.contrib import auth

这个模块下有所有的使用方法,进入auth源码就可以看到,自行去看,这里就不说了,接下来开始说一下它的使用方式

老规矩,新建django项目,也可以和我一样,如下图

大概这个层级,我懒得创建app,后面有需要的话我再单独创建,然后开始撸代码吧

首先在视图函数中写入

from django.contrib import auth
from django.shortcuts import render,redirect,HttpResponse


def login(request):
    if request.method == "POST":
        name = request.POST.get("username")
        pasd = request.POST.get("password")
        user_info = auth.authenticate(username=name, password=pasd) # 验证

        if user_info: # 如果验证成功
            auth.login(request,user_info)
            return redirect("/index/")
        else:
            return redirect("/login/")
    return render(request,"login.html")

def logout(request):
    return HttpResponse("logout")

def index(request):
    return render(request,"index.html")

然后接下来开始写urls

from django.conf.urls import url
from django.contrib import admin
from . import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/', views.login), # 增加
    url(r'^logout/', views.logout), # 增加
    url(r'^index/', views.index), # 增加
]

然后再

login.html

<form action="/login/" method="post">
    <input type="text" name="username">
    <input type="text" name="password">
    <input type="submit" value="登录">
    {% csrf_token %}
</form>


index.html

<h1>看到这个页面,证明你的用户登录成功了</h1>

上面的写完之后,在你的

 打开下面那个窗口之后,执行

makemigrations
migrate

然后执行完毕之后,不要关闭,继续执行

createsuperuser --username name

然后按照提示去操作,邮箱那一步可以不填,之后启动系统,只要你妹改别的,那么你看到的效果和我是一样的:

 再修改你的视图函数的代码

from django.contrib import auth
from django.shortcuts import render,redirect,HttpResponse


def login(request):
    if request.method == "POST":
        name = request.POST.get("username")
        pasd = request.POST.get("password")
        user_info = auth.authenticate(username=name, password=pasd)

        if user_info:
            auth.login(request,user_info)
            return redirect("/index/")
        else:
            return redirect("/login/")
    return render(request,"login.html")

def logout(request):
    auth.logout(request) # 加上
    return redirect("/login/")

def index(request):
    return render(request,"index.html")

然后在你的index.html里面写上

<h1>看到这个页面,证明你的用户登录成功了</h1>
<a href="/logout/">退出</a>

接下来重启系统,输入用户名和密码,然后成功后跳转到index页面,然后你会在index页面里面看到这个

 然后你点一下那个“退出”,可以看到它直接跳回到登录页面了,简单说一下

from django.shortcuts import render,redirect,HttpResponse


render:返回的是一个页面,前面必须跟参数
redirect:返回的是一个地址,就是你urls里面的第一个字段
HttpResponse:只返回内容给前端



后面还有很多的类似于这样的功能,后面说

介绍两个字段

is_authenticated()
使用:
    用户登陆后才能访问某些页面
    如果用户没有登陆就访问本应登陆才能访问的页面时会直接跳转到登陆页面
    用户在登陆页面登陆后,又会自动跳转到之前访问的页面
login_requierd()
    它和上一个效果一样
    它的路径设置方式在settings里面,自定义上:
    LOGIN_URL='/路径/'
    它的引入方式:
        from django.contrib.auth.decorators import login_required
    使用方式:
        @login_required() # 装饰器
        def login(request):

             ........

首先看第一种使用方式:

def index(request):

    if request.user.is_authenticated():  # 已登录
        return render(request,"index.html")
    else:
        return redirect("/login/")

def login(request):
    if request.method == "POST":
        name = request.POST.get("username")
        pasd = request.POST.get("password")
        user_info = auth.authenticate(username=name, password=pasd)
        if user_info:
            auth.login(request,user_info)
            return redirect("/index/")
        else:
            return redirect("/login/")
    return render(request,"login.html")

def logout(request):
    auth.logout(request)
    return redirect("/login/")

这一步只做了views的更改,其他都没做,系统执行后,你把链接分别放到两个浏览器里,一个登录了后,关闭浏览器再打开,会发现它依旧停留在index页面,但是!当你把这个链接放到一个新的浏览器的上,他跳转的是让你登录,动图不截了,你们自己试试,细心的人发现了,这个有什么用?你没发现这个认证系统比你自己写的有什么区别吗?结合使用的!没错,唇齿相依吧,我个人是这样理解的!接下来看另一种方式:

from django.contrib import auth
from django.contrib.auth.decorators import login_required
from django.shortcuts import render,redirect,HttpResponse


@login_required()
def index(request):
    return render(request,"index.html")

def login(request):
    if request.method == "POST":
        name = request.POST.get("username")
        pasd = request.POST.get("password")
        user_info = auth.authenticate(username=name, password=pasd)
        if user_info:
            auth.login(request,user_info)
            return redirect("/index/")
        else:
            return redirect("/login/")
    return render(request,"login.html")

def logout(request):
    auth.logout(request)
    return redirect("/login/")

写完了?写完了在你的settings里面最下面添加上

LOGIN_URL='/login/'

然后按照上述步骤重新试一下,然后你会发现url的问题

 

 能明白吗?你输入127.0.0.1:8000/index之后,它会给你跳转到login页面,然后下一个页面是index页面.........

 

  

  

  

 

posted on 2018-06-21 22:30  ArkhamKnight  阅读(75)  评论(0)    收藏  举报

导航