python之路

djano笔记(八)认证

2021-02-27  本文已影响0人  非鱼2018

1.用户认证

认证需要用到auth模块

使用django自带的User模型

在django shell里先创建用户,


>>> from django.contrib import auth

>>> from django.contrib.auth.models import User

>>> User.objects.create_user(username='user2001',password='123456')

<User: user2001>

验证,验证成功返回user对象

>>> auth.authenticate(username='user2001',password='123456')

<User: user2001>

如果验证失败,返回为None

>>> auth.authenticate(username='user2001',password='1234567')

没有返回

修改密码再次验证,验证成功

>>> user2001=User.objects.filter(username='user2001')[0]

>>> user2001.set_password('1234567')

>>> auth.authenticate(username='user2001',password='1234567')

<User: user2001>

此外还可以使用如下方法

create():创建一个普通用户,密码是明文的。 创建用户貌似登录不了

create_superuser():创建一个超级用户要多传一个邮箱 email 参数。

2.创建user app

python manage.py startapp users

setting文件激活模型

此外setting文件增加,LOGIN_URL = 'users:login',默认为account/login

父路由增加

path('users/', include('users.urls')),

users的子路由添加

path('', include('django.contrib.auth.urls')),

当用户请求、user/login.则会自动跳转到默认的登录视图

我们需要提供个登录的模板文件

路径在users\templates\registration\login.html

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>Title</title>

</head>

<body>

{% extends "myapp/base.html" %}

{% block page_header %}

<h2>用户登录</h2>

{% endblock page_header %}

{% block page_content %}

{% if form.errors %}

<p>Your username and password didn't match. Please try again.</p>

{% endif %}

<form method="post" action="{% url 'users:login' %}">

{% csrf_token %}

<!--{{ form.as_p }}-->

<div class="mb-3">

  <label for="formGroupExampleInput" class="form-label">用户名</label>

  <input type="text" class="form-control" id="formGroupExampleInput" name="username" placeholder="Example input placeholder">

</div>

<div class="mb-3">

  <label for="formGroupExampleInput2" class="form-label">密码</label>

  <input type="password" class="form-control" id="formGroupExampleInput2" name="password" placeholder="Another input placeholder">

</div>

<button name="submit"  class="btn btn-primary">Log in</button>

<input type="hidden" name="next" value="{% url 'myapp:index' %}" />

    <input type="hidden" name="next" value={{next}} />

</form>

{% endblock page_content %}

</body>

</html>

父模板添加登录连接

<a href="{% url 'users:login' %}">Log in</a>

以及注销连接

<a href="{% url 'users:logout' %}">Log out</a>

不用自己去写登录的视图,系统会自动调用默认的视图函数去认证

也可以自己去重写

from django.contrib.auth import authenticate

user = authenticate(username='john', password='secret')

if user is not None:

# A backend authenticated the credential

selse:

# No backend authenticated the credentials
image.png

*自定义登出模板

路径在users\templates\registration\logged_out.html

   {% extends "learning_logs/base.html" %}

{% block content %}

<p>已经登出,欢迎再回来!</p><a href="{% url 'users:login' %}">再次登录</a>

{% endblock content %}

路由

path('user_logout/',views.user_logout,name='user_logout')

视图

def user_logout(request):

    logout(request)

    return render(request, 'registration/logged_out.html')

再次运行,发现还是用的默认的登出

image.png

而且再次登录会跳转到admin的登录页面

image.png

将logged_out.html移动到template下面,修改视图

def user_logout(request):

    logout(request)

    return render(request, 'logged_out.html')

再次执行

image.png

*修改注册用户

3几个内置的form

from django.contrib.auth.forms import UserCreationForm,UserChangeForm

from django.http import HttpResponse

def register(request):

    """Register a new user."""

    if request.method != 'POST':

        form = UserCreationForm()

    else:

        form = UserCreationForm(data=request.POST)

        if form.is_valid():

            new_user = form.save()

            login(request, new_user)

            return redirect('myapp:index')

    # Display a blank or invalid form.

    context = {'form': form}

    return render(request, 'registration/register.html', context)

def change_user(request):

    if request.method != 'POST':

        form = UserChangeForm()

    else:

        form = UserChangeForm(data=request.POST)

        if form.is_valid():

            form.save()

            return HttpResponse("修改成功")

    # Display a blank or invalid form.

    context = {'form': form}

    return render(request, 'changgeuser.html', context)
path('', include('django.contrib.auth.urls')),

    path('register/', views.register, name='register'),

    path('user_logout/',views.user_logout,name='user_logout'),

    path('change_user/',views.change_user,name='change_user')

模板文件

{% extends "myapp/base.html" %}

{% block page_content %}

<form method="post" action="{% url 'users:change_user' %}">

{% csrf_token %}

{{ form.as_p }}

<button name="submit">修改</button>

</form>

{% endblock page_content %}

changgeuser会发现很多字段,很多字段都是非必要的,可以自己写form,然后取自己需要的字段就可以

image.png

除此之外,user模型还有一些其他的默认视图,比如重置密码,修改密码,等等,都是一些CBV,基于类的视图,在路由里指定对应模式后就可以使用

image.png
上一篇下一篇

猜你喜欢

热点阅读