python 认证_Django 用户认证
內置用戶認證
django 的用戶分為三類,匿名用戶,普通用戶,超級用戶
普通用戶是無法登錄admin 后臺的的,因此我們的普通視圖使用這個用戶來管理
超級用戶是最高權限,可以登錄admin后臺,可以使用python manage.py createsuperuser 來創建一個超級用戶
內置用戶類型
匿名用戶.
普通類型
普通用戶是無法登錄admin 后臺的的,因此我們的普通視圖使用這個用戶來管理
def create_user(self, username, email=None, password=None, **extra_fields):
extra_fields.setdefault('is_staff', False)
extra_fields.setdefault('is_superuser', False)
return self._create_user(username, email, password, **extra_fields)
超級用戶
超級用戶是最高權限,可以登錄admin后臺,可以使用python manage.py createsuperuser 來創建一個超級用戶
def create_superuser(self, username, email, password, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
用戶認證模式 -1: 用戶名
我們在用戶注冊界面使用的是用戶名稱
使用內值的form from django.contrib.auth.forms import UserCreationForm
創建對應的模板文件signup.html
Sign up
{% csrf_token %}
{{ form.as_p }}
Sign up
:views.py
def signup(request):
"""
使用用戶名來注冊
:param request:
:return:
"""
if request.method == 'POST':
form = UserCreationForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
raw_password = form.cleaned_data.get('password1')
user = authenticate(username=username, password=raw_password)
login(request, user)
return redirect('article-list')
else:
form = UserCreationForm()
return render(request, 'pre_user/signup.html', {'form': form})
截圖如下
用戶認證模式2: 有附加字段
在某些特殊情況下我們可能會在用戶注冊的時候需要輸入生日這個樣子的字段,但是User 并不包含該字段,因此我們需要擴展User 模型
models.py
class Profile(models.Model):
""" 多余字段注冊 """
user = models.OneToOneField(User, on_delete=models.CASCADE)
bio = models.TextField(max_length=500, blank=True)
location = models.CharField(max_length=30, blank=True)
birth_date = models.DateField(null=True, blank=True)
@receiver(post_save, sender=User)
def update_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
instance.profile.save()
forms.py
class SignUpForm(UserCreationForm):
birth_date = forms.DateField(help_text='Required. Format: YYYY-MM-DD')
class Meta:
model = User
fields = ('username', 'birth_date', 'password1', 'password2', )
views.py
django.contrib.auth import login, authenticate
django.shortcuts import render, redirect
pre_user.forms import SignUpForm
signup(request):
if request.method == 'POST':
form = SignUpForm(request.POST)
if form.is_valid():
user = form.save()
user.refresh_from_db() # load the profile instance created by the signal
user.profile.birth_date = form.cleaned_data.get('birth_date')
user.save()
raw_password = form.cleaned_data.get('password1')
user = authenticate(username=user.username, password=raw_password)
login(request, user)
return redirect('article-list')
else:
form = SignUpForm()
return render(request, 'pre_user/signup.html', {'form': form})
4 . 模板文件不需要修改
截圖
用戶認證模式2: 郵箱注冊
這是最常見的用戶注冊模式
擴展用戶創建的forms.py
class SignUpForm(UserCreationForm):
""" 使用郵箱注冊"""
email = forms.EmailField(max_length=254, help_text='Required. Inform a valid email address.')
class Meta:
model = User
fields = ('username', 'email', 'password1', 'password2', )
views.py
(1) 注冊視圖
def signup(request):
if request.method == 'POST':
form = SignUpForm(request.POST)
if form.is_valid():
user = form.save(commit=False)
user.is_active = False
user.save()
current_site = get_current_site(request)
subject = 'Activate Your MySite Account'
message = render_to_string('pre_user/account_activation_email.html', {
'user': user,
'domain': current_site.domain,
'uid': urlsafe_base64_encode(force_bytes(user.pk)),
'token': account_activation_token.make_token(user),
})
# user.email_user(subject, message) # 給該用戶發送郵件
user.email_user(subject=subject, message='message',html_message=message) # 給該用戶發送郵件
return redirect('account_activation_sent')
# return HttpResponse("郵箱已經發送,請前往驗證")
else:
form = SignUpForm()
return render(request, 'pre_user/signup.html', {'form': form})
(2) 用戶激活郵箱
def activate(request, uidb64, token):
try:
uid = force_text(urlsafe_base64_decode(uidb64))
user = User.objects.get(pk=uid)
except (TypeError, ValueError, OverflowError, User.DoesNotExist):
user = None
if user is not None and account_activation_token.check_token(user, token):
user.is_active = True
user.profile.email_confirmed = True
user.save()
login(request, user)
return redirect('article-list')
else:
return render(request, 'pre_user/account_activation_invalid.html')
(3) 注冊鏈接
urls.py
urlpatterns = [
url(r'^signup/$', views.signup),
url(r'^login/$', auth_views.login,
{'template_name': 'pre_user/login.html', 'authentication_form': LoginForm}),
url(r'^activate/(?P[0-9A-Za-z_\-]+)/(?P[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$',
views.activate, name='activate'),
url(r'^account_activation_sent/$', views.account_activation_sent, name='account_activation_sent'),
]
(4)模板
account_activation_email.html
{% extends 'pre_user/base.html' %}
{% block content %}
{% autoescape off %}
Hi {{ user.username }},
Please click on the link below to confirm your registration:
http://{{ domain }}{% url 'activate' uidb64=uid token=token %}
{% endautoescape %}
{% endblock %}
account_activation_sent.html
{% extends 'pre_user/base.html' %}
{% block content %}
郵件已經發送
{% endblock %}
account_activation_invalid.html
{% extends 'pre_user/base.html' %}
{% block content %}
郵件格式不合法
{% endblock %}
總結
以上是生活随笔為你收集整理的python 认证_Django 用户认证的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pythondocx文档重叠_使用PYT
- 下一篇: python字典功能默写_Python