Django_day05

Django

登錄注冊功能

配置settings.py
在最后加上

# 配置沒有登錄則跳轉(zhuǎn)到登錄
LOGIN_URL = '/users/login/'

配置templates

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

M(models):
models.py

V(views):
urls.py
views.py
forms.py

T(templates):
base.html
index.html
login.html
register.html

關(guān)聯(lián)關(guān)系:url——>瀏覽器——>views.py&urls.py——>templates&html——>forms.py&views.py&urls.py——>templates&html

urls.py

from django.conf.urls import url
from django.contrib.auth.decorators import login_required

from users import views

urlpatterns = [
    # 注冊
    url(r'^register/', views.register, name='register'),
    # 登錄
    url(r'^login/', views.login, name='login'),
    # 首頁
    url(r'^index/', login_required(views.index), name='index'),
    # 注銷
    url(r'^logout', login_required(views.logout), name='logout'),
]

首先導入相應的庫
login_required() 顧名思義官撼,需要登錄后才能訪問

forms.py

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


class UserForm(forms.Form):
    """
    校驗注冊信息
    """
    # username = forms.CharField(required=True)
    # password = forms.CharField(required=True)
    # password2 = forms.CharField(required=True)

    username = forms.CharField(required=True,
                               max_length=5,
                               min_length=2,
                               error_messages={
                                   'required': '用戶必填',
                                   'max_length': '長度不能超過5位',
                                   'min_length': '長度不能少于2位'
                               })
    password = forms.CharField(required=True,
                               min_length=6,
                               error_messages={
                                   'required': '密碼必填',
                                   'min_length': '長度不能少于6位'
                               })
    password2 = forms.CharField(required=True,
                                min_length=6,
                                error_messages={
                                    'required': '密碼必填',
                                    'min_length': '長度不能少于6位'
                                })

    def clean(self):
        # 校驗用戶名是否已經(jīng)注冊過
        user = User.objects.filter(username=self.cleaned_data.get('username'))
        if user:
            # 已經(jīng)被注冊
            raise forms.ValidationError({'username': '用戶名已經(jīng)存在使碾,請直接登錄'})
            pass
        else:
            # 沒有被注冊
            pass
        # 校驗密碼和確認密碼是否相同
        if self.cleaned_data.get('password') != self.cleaned_data.get('password2'):
            raise forms.ValidationError({'password2': '兩次密碼不一致'})
        return self.cleaned_data


class CheckUserForm(forms.Form):
    username = forms.CharField(required=True,
                               max_length=5,
                               min_length=2,
                               error_messages={
                                   'required': '用戶必填',
                                   'max_length': '長度不能超過5位',
                                   'min_length': '長度不能少于2位'
                               })
    password = forms.CharField(required=True,
                               min_length=6,
                               error_messages={
                                   'required': '密碼必填',
                                   'min_length': '長度不能少于6位'
                               })

    def clean(self):
        # 校驗用戶名是否已經(jīng)注冊過
        user = User.objects.filter(username=self.cleaned_data.get('username')).first()
        if user:
            # 已經(jīng)被注冊
            pass
        else:
            # 沒有被注冊
            raise forms.ValidationError({'username': '用戶名不存在趴俘!'})

forms.py的作用是檢測和過濾從html頁面?zhèn)鬟^來的值,并且返回對應的錯誤提示除抛。得到期望的數(shù)據(jù)。

views.py

from django.contrib import auth
from django.contrib.auth.models import User
from django.http import HttpResponseRedirect
from django.shortcuts import render
from django.urls import reverse

from users.forms import UserForm, CheckUserForm


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

    if request.method == 'POST':
        # 校驗頁面中傳遞的參數(shù)是否填寫完整
        # username = request.POST.get('username')
        form = UserForm(request.POST)
        # is_valid():判斷表單是否驗證通過
        if form.is_valid():
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            User.objects.create_user(username=username, password=password)
            # 實現(xiàn)跳轉(zhuǎn)
            return HttpResponseRedirect(reverse('users:login'))
        else:
            return render(request, 'register.html', {'form': form})


def login(request):
    if request.method == 'GET':
        return render(request, 'login.html')
    if request.method == 'POST':
        # 表單驗證盐茎,用戶名和密碼是否填寫无宿,校驗用戶名是否注冊
        form = CheckUserForm(request.POST)
        if form.is_valid():
            # 校驗用戶名和密碼,判斷返回的對象是否為空赂弓,如果不為空绑榴,則為user對象
            user = auth.authenticate(
                username=form.cleaned_data['username'],
                password=form.cleaned_data['password']
            )
            if user:
                # 校驗成功 用戶名和密碼是正確的 加密方法是Django自帶的,所以用Django自帶的方法
                auth.login(request, user)
                return HttpResponseRedirect(reverse('users:index'))
            else:
                # 密碼錯誤
                return render(request, 'login.html', {'error': '密碼錯誤'})
        else:
            return render(request, 'login.html', {'form': form})


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


def logout(request):
    if request.method == 'GET':
        # 注銷
        auth.logout(request)
        return HttpResponseRedirect(reverse('users:login'))

views.py負責響應請求盈魁,根據(jù)request中的不同請求完成不同的操作彭沼。

知識小結(jié):
forms.py:

  • 1.新建UserForm類和CheckUserForm類,并且都繼承forms.Form备埃。
  • 2.使用forms中的CharField方法對頁面中傳來的數(shù)據(jù)進行過濾,并返回錯誤提示姓惑。
  • 3.clean方法,對用戶信息進行查重按脚。

views.py:

  • 1.實例化UserForm和CheckUserForm,調(diào)用is_valid()方法判斷表單是否驗證通過,通過為True于毙,不通過為False且返回錯誤報告(return render(request, 'register.html', {'form': form}))
  • 2.auth.authenticate()校驗用戶名和密碼,判斷返回的對象是否為空辅搬,如果不為空唯沮,則為user對象
user = auth.authenticate(
                username=form.cleaned_data['username'],
                password=form.cleaned_data['password']
            )
  • 3.auth.login(request, user) 用戶登入
    校驗成功,用戶名和密碼是正確的則允許登入。request中user有匿名用戶(AnonymousUser)變?yōu)橹付ㄓ脩簟?加密方法是Django自帶的堪遂,所以用Django自帶的方法
  • 4.auth.logout(request) 注銷
    將request中的user用戶變?yōu)槟涿脩?AnonymousUser)介蛉,實現(xiàn)登出。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末溶褪,一起剝皮案震驚了整個濱河市币旧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌猿妈,老刑警劉巖吹菱,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異彭则,居然都是意外死亡鳍刷,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門俯抖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來输瓜,“玉大人,你說我怎么就攤上這事芬萍∮却В” “怎么了?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵担忧,是天一觀的道長芹缔。 經(jīng)常有香客問我,道長瓶盛,這世上最難降的妖魔是什么最欠? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮惩猫,結(jié)果婚禮上芝硬,老公的妹妹穿的比我還像新娘。我一直安慰自己轧房,他們只是感情好拌阴,可當我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著奶镶,像睡著了一般迟赃。 火紅的嫁衣襯著肌膚如雪陪拘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天纤壁,我揣著相機與錄音左刽,去河邊找鬼。 笑死酌媒,一個胖子當著我的面吹牛欠痴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播秒咨,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼喇辽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了雨席?” 一聲冷哼從身側(cè)響起菩咨,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎舅世,沒想到半個月后旦委,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡雏亚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年缨硝,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片罢低。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡查辩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出网持,到底是詐尸還是另有隱情宜岛,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布功舀,位于F島的核電站萍倡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏辟汰。R本人自食惡果不足惜列敲,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望帖汞。 院中可真熱鬧戴而,春花似錦、人聲如沸翩蘸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至扶踊,卻和暖如春泄鹏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背姻檀。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工命满, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绣版。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像歼疮,于是被迫代替她去往敵國和親杂抽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 22年12月更新:個人網(wǎng)站關(guān)停韩脏,如果仍舊對舊教程有興趣參考 Github 的markdown內(nèi)容[https://...
    tangyefei閱讀 35,160評論 22 257
  • 此段內(nèi)容簡要來自自強學堂的教程詳情請查詢自強學堂 一缩麸、 后臺的運作流程 接收request請求 處理數(shù)據(jù) 獲取請求...
    coder_ben閱讀 5,244評論 6 56
  • 切換到創(chuàng)建項目的目錄 cd C:\Users\admin\Desktop\DjangoProject創(chuàng)建名為pr...
    在努力中閱讀 3,259評論 2 3
  • 就在坐上摩托車的一瞬間吹散,我感覺我自己還真是小心眼并且愛斤斤計較呢弧械。 那一刻我就在想這個人為你這么勞心勞力,說你幾句...
    不寫悲傷閱讀 165評論 0 0
  • 有道理空民! 曹操再奸刃唐,都有知心朋友,劉備再好界轩,都有死對頭画饥,孫權(quán)再溫柔,兩邊都是仇浊猾。不要太在乎別人對你的評價抖甘,做好自己...
    茶女子張怡閱讀 86評論 0 1