settings
EMAIL_HOST = 'smtp.163.com'
EMAIL_PORT = 25
EMAIL_HOST_USER = 'buwusheng@163.com'
EMAIL_HOST_PASSWORD = '009723'
EMAIL_FROM = 'python<buwusheng@163.com>'
urls
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('',include("App.urls"))
]
App.urls
from django.urls import path
from App import views
app_name='App'
urlpatterns = [
path('checkuser/',views.check_user,name='checkuser'),
path('active/<token>/',views.active_user,name='activeuser'),
]
App.views
from django.core.mail import send_mail
from django.http import HttpResponse
from django.shortcuts import render
from django.template import loader
from django.urls import reverse
from App.models import User
from App.util import token_confirm
from day08.settings import EMAIL_FROM
def check_user(request):
if request.method =='POST':
username = request.POST.get('username')
password = request.POST.get('password')
user = User.objects.filter(username=username,password=password).first()
if user:
return HttpResponse("用户已经存在")
user = User.objects.create(username=username,password=password,is_active=0)
token = token_confirm.generate_validate_token(user.uid)
print(token)
url = "http://"+request.get_host()+reverse("App:activeuser",kwargs={'token':token})
html = loader.get_template('active.html').render({'url':url})
print(url)
send_mail("账号激活",'',EMAIL_FROM,['buwusheng@163.com'],html_message=html)
return HttpResponse("激活邮件已经发送,请登录邮箱确认激活")
return render(request,'register.html')
def active_user(request,token):
try:
uid = token_confirm.confirm_validate_token(token)
except:
uid = token_confirm.remove_validate_token(token)
user = User.objects.get(pk=uid)
user.delete()
return HttpResponse("激活失败,请重新注册")
try:
user = User.objects.get(pk=uid)
except User.DoesNotExist:
return HttpResponse("你激活的用户不存在,请重新注册")
user.is_active = 1
user.save()
return HttpResponse("用户已激活,请登录系统")
App.models
from django.db import models
class User(models.Model):
uid = models.AutoField(primary_key=True)
username = models.CharField(unique=True, max_length=30)
password = models.CharField(max_length=128)
regtime = models.DateTimeField(auto_now=True)
is_active = models.IntegerField(default=1)
class Meta:
db_table = 'user'
App.util
from itsdangerous import URLSafeTimedSerializer as utsr
import base64
from django.conf import settings as django_settings
class Token:
def __init__(self, security_key):
self.security_key = security_key
self.salt = base64.encodebytes(security_key.encode('utf8'))
def generate_validate_token(self, username):
serializer = utsr(self.security_key)
return serializer.dumps(username, self.salt)
def confirm_validate_token(self, token, expiration=3600):
serializer = utsr(self.security_key)
return serializer.loads(token, salt=self.salt, max_age=expiration)
def remove_validate_token(self, token):
serializer = utsr(self.security_key)
print(serializer.loads(token, salt=self.salt))
return serializer.loads(token, salt=self.salt)
token_confirm = Token(django_settings.SECRET_KEY)
register.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="{% url 'App:checkuser' %}" method="post">
{% csrf_token %}
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"> <br>
<input type="submit">
</form>
</body>
</html>
active.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>账户激活</title>
</head>
<body>
<p>亲爱的用户:</p>
<h2>请点击链接 <a href="{{ url }}">激活 </a> 账号</h2>
</body>
</html>