Django學習筆記:第十天 專案AXF-02使用者頁面
阿新 • • 發佈:2020-07-25
使用者啟用,認證
-- 途徑
-- 郵件
-- 簡訊
-- 人工稽核
-- 郵件
-- 傳送郵件
-- 收件人地址
-- 發件人的資訊
-- 使用者名稱
-- 密碼
-- 伺服器
-- 郵件伺服器
-- 埠
-- 不加密預設25
-- 加密465,965
-- 內容
-- 點選郵件中的連結就可以啟用
-- 連結中存在使用者的唯一標識
-- http://xxxxx/activate/?u_token=YYYY
-- u_token 快取中 作為key, value -> user_id
-- u_token - > uuid
-- 標識存在過期時間
-- 標識存在使用次數限制
url.py
from django.urls import path from App import views app_name = 'App' urlpatterns = [ path('home/', views.home, name='home'), path('market/', views.market, name='market'), path('marketwithparams/<int:typeid>/<int:childcid>/<order_rule>/', views.market_with_params, name='market_with_params'), path('cart/', views.cart, name='cart'), path('mine/', views.mine, name='mine'), path('register/', views.register, name="register"), path('login/', views.login, name="login"), path('checkuser/', views.check_user, name="check_user"), path('logout/', views.logout, name="logout"), path('activate/', views.activate, name="activate"), ]
views.py
def mine(request): user_id = request.session.get('user_id') data = { "title": "我的", "is_login": False } if user_id: user = AXFUser.objects.get(pk=user_id) data['is_login'] = True data['username'] = user.u_username data['icon'] = MEDIA_KEY_PREFIX + user.u_icon.url return render(request, 'main/mine.html', context=data) def register(request): if request.method == "GET": data = { "title": "Register", } return render(request, 'user/register.html', context=data) elif request.method == "POST": username = request.POST.get("username") email = request.POST.get("email") password = request.POST.get("password") icon = request.FILES.get("icon") # 密碼摘要加密 # password = hash_str(password) # Django內建加密 password = make_password(password) user = AXFUser() user.u_username = username user.u_password = password user.u_email = email user.u_icon = icon user.save() # 使用uuid生成唯一標識字串 u_token = uuid.uuid4().hex # 存入快取中 cache.set(u_token, user.id, timeout=60*60*24) send_email_activate(username, email, u_token) return redirect(reverse("axf:login")) def login(request): if request.method == "GET": data = { "title": "登陸" } return render(request, 'user/login.html', context=data) elif request.method == "POST": username = request.POST.get("username") password = request.POST.get("password") # 校驗密碼 users = AXFUser.objects.filter(u_username=username) if users.exists(): user = users.first() # 使用者密碼,資料安全後的密碼 if check_password(password, user.u_password): # 儲存使用者登入狀態 request.session['user_id'] = user.id return redirect(reverse('axf:mine')) else: print("密碼錯誤") return redirect(reverse('axf:login')) print("使用者不存在") return redirect(reverse('axf:login')) def check_user(request): username = request.GET.get("username") users = AXFUser.objects.filter(u_username=username) data = { "status": HTTP_OK, "msg": 'user can use', } if users.exists(): data['status'] = HTTP_USER_EXIST data['msg'] = 'user already exist' else: pass return JsonResponse(data=data) def logout(request): request.session.flush() return redirect(reverse('axf:mine')) # 啟用 def activate(request): u_token = request.GET.get('u_token') user_id = cache.get(u_token) if user_id: user = AXFUser.objects.get(pk=user_id) user.is_active =True user.save() return redirect(reverse('axf:login')) return render(request, 'user/activate_fail.html')
views_helper.py
import hashlib from django.core.mail import send_mail from django.template import loader from GPAXF.settings import EMAIL_HOST_USER, SERVER_HOST, SERVER_PORT # 密碼摘要加密 def hash_str(source): return hashlib.new('sha512', source.encode('utf-8')).hexdigest() # 啟用-傳送啟用郵件 def send_email_activate(username, receive, u_token): subject = '%s AXF Activate' % username from_email = EMAIL_HOST_USER recipient_list = [receive, ] data = { 'username': username, 'activate_url': 'http://{}:{}/axf/activate/?u_token={}'.format(SERVER_HOST, SERVER_PORT, u_token) } # 獲取模板並渲染成頁面 html_message = loader.get_template('user/activate.html').render(data) send_mail(subject=subject, message="", html_message=html_message, from_email=from_email, recipient_list=recipient_list)