国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

django的登錄注冊系統的示例代碼

2020-01-04 15:05:04
字體:
來源:轉載
供稿:網友

摘要

django框架本身自帶有登錄注冊,也可以自己寫登錄注冊,下面將介紹這這2種方式實登錄注冊

一、自己寫登錄注冊登出

1.注冊regist

注冊采用的是form表單,提交到數據庫,在登錄的時候,查詢數據看,看用戶有沒有注冊,如果用戶沒有注冊,則返回注冊頁面注冊

(1)models.py文件里創建相關的字段: 用戶名字/用戶密碼/cookies攜帶的ticket

from django.db import models# Create your models here.class Users(models.Model):  u_name = models.CharField(max_length=10)  u_password = models.CharField(max_length=255)  u_ticket = models.CharField(max_length=30, null=True)  class Meta:    db_table = 'day51_user'

(2)urls.py 配置相關路由

from django.conf.urls import urlfrom uauth import viewsurlpatterns = [  url(r'^regist/', views.regist),  url(r'^login/', views.login),  url(r'^logout', views.logout)]

(3)views.py 書寫regist方法

導入相關的包,在regist,login,logout都會使用到

import randomimport timefrom django.contrib import authfrom django.contrib.auth.hashers import make_password,check_passwordfrom django.contrib.auth.models import Userfrom django.http import HttpResponseRedirect, HttpResponsefrom django.shortcuts import renderfrom django.core.urlresolvers import reverse# Create your views here.from uauth.models import Users

如果用戶請求regist方法,則直接跳轉到相關的html頁面。

如果用戶在html頁面點擊了post按鈕,對密碼進行加密后,將數據提交到數據庫,并返回登錄login頁面。

獲得post提交的表單文字,使用request.POST.get(' ')

def regist(request):  if request.method == 'GET':    return render(request, 'day6_regist.html')  if request.method == 'POST':    # 注冊    name = request.POST.get('name')    password = request.POST.get('password')    # 對密碼進行加密    password = make_password(password)    Users.objects.create(u_name=name, u_password=password)    return HttpResponseRedirect('/uauth/login/')

編寫regist的提交表單, method方法選擇'POST'

文件目錄在templates下[圖片上傳中...(image.png-cc7763-1526105439415-0)]

{%csrf_token%}是針對提交的時候csrf跨域錯誤

<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <title>注冊頁面</title></head><body><form action="" method="POST">  {% csrf_token %}  注冊姓名:<input type="text" name="name">  注冊密碼:<input type="password" name="password">  <input type="submit" value="提交"></form></body></html>

2.登錄login

(1)配置路由urls.py, 與注冊的時候一樣的操作

(2)配置views.py, 編寫login方法

如果是GET請求,則跳轉到登錄的html界面中

def login(request):  if request.method == 'GET':    return render(request, 'day6_login.html')

如果是POST請求,則將獲得的用戶密碼與數據庫的用戶密碼進行比較。如果相同,就賦值一個ticker到瀏覽器上,將ticket存入數據庫中,這樣后續的瀏覽器操作只需判斷ticket是否正確就好,如果錯誤,返回登錄界面

知識點

綁定cookie命令: set_cookie

查詢一個用戶是否存在:exists()

def login(request):  if request.method == 'GET':    return render(request, 'day6_login.html')  if request.method == 'POST':    # 如果登錄成功,綁定參數到cookie中,set_cookie    name = request.POST.get('name')    password = request.POST.get('password')    # 查詢用戶是否在數據庫中    if Users.objects.filter(u_name=name).exists():      user = Users.objects.get(u_name=name)      if check_password(password, user.u_password):        # ticket = 'agdoajbfjad'        ticket = ''        for i in range(15):          s = 'abcdefghijklmnopqrstuvwxyz'          # 獲取隨機的字符串          ticket += random.choice(s)        now_time = int(time.time())        ticket = 'TK' + ticket + str(now_time)        # 綁定令牌到cookie里面        # response = HttpResponse()        response = HttpResponseRedirect('/stu/index/')        #max_age 存活時間(秒)        response.set_cookie('ticket', ticket, max_age=10000)        # 存在服務端        user.u_ticket = ticket        user.save() #保存        return response      else:        # return HttpResponse('用戶密碼錯誤')        return render(request, 'day6_login.html', {'password': '用戶密碼錯誤'})    else:      # return HttpResponse('用戶不存在')      return render(request, 'day6_login.html', {'name': '用戶不存在'})

登錄相關的html

<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <title>登錄頁面</title></head><body><form action="" method="POST">  {% csrf_token %}  登錄姓名:<input type="text" name="name">  登錄密碼:<input type="password" name="password">  <input type="submit" value="提交"></form></body></html>

相關的數據庫

django,登錄,注冊,代碼

補充說明:如何在主頁中判斷ticket

知識點:獲得瀏覽器cookie攜帶的ticket: request.COOKIES.get('ticket')

這只能判斷一個網頁需不需要進行判斷驗證,如果需要很多網頁進行驗證,這是需要采用中間件,這個稍候會涉及到

def index(request):  if request.method == 'GET':    # 獲取所有學生信息    ticket = request.COOKIES.get('ticket')    if not ticket:      return HttpResponseRedirect('/uauth/login/')    if Users.objects.filter(u_ticket=ticket).exists():      stuinfos = StudentInfo.objects.all()      return render(request, 'index.html', {'stuinfos': stuinfos})    else:      return HttpResponseRedirect('/uauth/login/')

3.登出系統

實現登出目的,選擇刪除數據庫中的ticket:delete_cookie

登出過后,自動跳轉到登錄界面

def logout(request):  if request.method == 'GET':    # response = HttpResponse()    response = HttpResponseRedirect('/uauth/login/')    response.delete_cookie('ticket')    return response

4.中間件middleware

應用:在django中,中間件其實就是一個類,在請求到來和結束后,django會根據自己的規則在合適的時機執行中間件中相應的方法。

中間件的5個方法:

process_request(self,request) :當用戶發起請求的時候會依次經過所有的的中間件,這個時候的請求是process_request :

process_view(self, request, callback, callback_args, callback_kwargs) :進入views函數, 執行process_view

process_template_response(self,request,response) : 只有當views函數中返回的對象中具有render方法,是就會直接process_template_responseprocess

process_exception(self, request, exception) : 當views的函數中出現錯誤時,就會執行process_exception方法

process_response(self, request, response)

:views函數處理后,在依次穿過中間件,這個時候是process_response,最后返回給請求者

中間件的運行流程

django,登錄,注冊,代碼

5. 使用中間件完成登錄的驗證

中間件return None 或什么都不返回的時候表示什么都不做,跳過這一個過程

配置中間件,實現登錄的驗證

(1)配置settings.py

1) 在主工程文件下創建一個utils文件,

在utils里: a. 創建中間件文件(名字自己?。?b.創建一個工程文件 __init__.py

django,登錄,注冊,代碼

2)settings.py配置

在MIDDILEWARE里添加相關的文件路徑

django,登錄,注冊,代碼

3) 配置相關的中間件文件

from django.http import HttpResponseRedirectfrom django.utils.deprecation import MiddlewareMixinfrom uauth.models import Usersfrom stu.models import Countaddstuclass AuthMiddleware(MiddlewareMixin):  def process_request(self, request):    # 統一驗證登錄    # return none 或者 不寫return才會繼續往下執行, 不需要執行    if request.path == '/uauth/login/' or request.path == '/uauth/regist/':      return None    ticket = request.COOKIES.get('ticket')    if not ticket:      return HttpResponseRedirect('/uauth/login/')    users = Users.objects.filter(u_ticket=ticket)    if not users:      return HttpResponseRedirect('/uauth/login/')# 將user賦值在request請求的user上,以后可以直接判斷user有沒有存在# 備注,django自帶的有user值    request.user = users[0]

6. 至此,自己建造的登錄驗證系統已經完成

二、 django自帶的登錄驗證系統

自帶的登錄驗證系統中不需要自己手動的設置ticket

1.settings.py文件中配置沒登錄的跳轉頁面

LOGIN_URL = '/uauth/dglogin'

2.urls.py中配置相關路由

from django.conf.urls import urlfrom uauth import viewsurlpatterns = [  url(r'dglogin/', views.dglogin),  url(r'^dgregist/', views.dgregist),  url(r'^dglogout/', views.dglogout)]

3. views.py導入相關的庫文件

from django.contrib import authfrom django.contrib.auth.hashers import make_password, check_passwordfrom django.contrib.auth.models import Userfrom django.http import HttpResponseRedirect, HttpResponsefrom django.shortcuts import render

4.views.py文件中書寫注冊dgregist方法

from django.contrib.auth.models import Userdef dgregist(request):  if request.method == 'GET':    return render(request, 'day6_regist.html')  if request.method == 'POST':    name = request.POST.get('name')    password = request.POST.get('password')    User.objects.create_user(username=name, password=password)    return HttpResponseRedirect('/uauth/dglogin/')

5. views.py文件中書寫注冊dglogin方法

def dglogin(request):  if request.method == 'GET':    return render(request, 'login.html')  if request.method == 'POST':    name = request.POST.get('name')    password = request.POST.get('password')    # 驗證用戶名和密碼,通過的話,返回User對象    user = auth.authenticate(username=name, password=password)    if user:        auth.login(request, user)      return HttpResponseRedirect('/stu/index/')    else:      return render(request, 'index.html')

6. 在app的urls.py中設置驗證require

from django.conf.urls import urlfrom django.contrib.auth.decorators import login_requiredfrom stu import viewsurlpatterns = [  url(r'addstu/', login_required(views.addStu), name='add'),  url(r'index/', login_required(views.index)),]

7.登出dglogout

def dglogout(request):  if request.method == 'GET':    auth.logout(request)    return HttpResponseRedirect('/uauth/dglogin')

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到python教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 黑河市| 永吉县| 正蓝旗| 红安县| 库尔勒市| 大田县| 巍山| 喜德县| 凤庆县| 梁河县| 宜丰县| 鸡泽县| 隆回县| 井陉县| 原阳县| 玛曲县| 尚志市| 大余县| 罗甸县| 曲阳县| 清涧县| 沾化县| 新郑市| 广平县| 太保市| 和静县| 青神县| 枝江市| 饶平县| 中山市| 土默特左旗| 白河县| 韶山市| 咸宁市| 宁津县| 普格县| 海林市| 灵川县| 鹰潭市| 富源县| 香港 |