Django 02 簡單註冊頁面的創建1

一、頁面運行

1.當在網頁運行時報錯

200-300:代表成功

300-400:位置發生改變

400-500:資源部可用,比如資源地址寫的不對,或者資源地址寫得對但權限不夠

500:服務器頁面報錯

2.HTTP請求中POST與GET的區別

一般我們在瀏覽器輸入一個網址訪問網站都是GET請求;在FROM表單中,可以通過設置method指定提交方式爲GET或者POST提交方式,默認爲GET提交方式

    HTTP定義了與服務器交互的不同方法,其中最基本的四種:GET  POST PUT DELETE  HEAD,其中GET和HEAD 被稱爲安全方法,因爲使用GET和HEAD的HTTP請求不會產生什麼動作.不會產生動作意味着GET和HEAD的HTTP請求不會在服務器上產生任何結果.但是安全方法並不是什麼動作不產生,這裏的安全方法是緊緊不會修改信息

    根據HTTP規範,POST可能修改服務器上的資源的請求.比如CSDN的博客,用戶提交一篇文章或者一個讀者提交評論是通過POST請求來實現的,因爲在提交文章或者評論提交後資源(某個頁面)不同了,或者說資源被修改了,這些便是"不安全方法"

二、通過Django創建頁面邏輯

1.創建項目得到文件目錄

2.創建新的模板>>文件夾>>頁面


3.wsgi.py   將http請求轉變爲運行代碼

4.代碼解析 進入uls.py 配置目錄 按照先後順序匹配urlpatterns每個元素(此處通過path()處理字符串路由),字符串匹配成功後,停止查找,根據結果執行對應的處理函數(匹配不成功出現異常)

5.通過views.py中填寫的函數處理請求註冊的命令,再通過templates下的頁面代碼展現靜態頁面

6.models.py 創建一個對象(類 )

7. 此Django與數據庫MySQL的連接.我們需要 更改django的數據庫連接引擎 django連接數據庫必須要有django driver 爲mysqlclient 版本爲1.7.3+ 

在DOS可以通過 pip install mysqlclient來安裝

然後在settings.py中更改


8. 通過  manage.py總項目配置  執行三條命令(在Mysql中提前創建py_blog庫)

   <1>makemigrations 項目名(apps.py裏的name) :完成models.py所要創建的模板     

   <2>sqlmigrate 項目名 0001 :提示將要執行的的sql語句

   <3>migrate 項目名 0001 :執行sql命令

9.檢查settings.py下TEMPLATES裏面的DIRS有沒有填寫如果沒有就補寫


三、註冊頁面

1.創建項目exercise

在模板中創建一個python包 再創建兩個html頁面


register.html

 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form>
    <p>
        用戶名:<input type="text">
    </p>
    <p>
        密碼:<input type="password">
    </p>
    <p>
        <input type="submit" value="註冊">
    </p>
</form>
</body>
</html>

welcome.html

 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>註冊成功,歡迎訪問本頁面</h1>
</body>
</html>

2.settings.py更改設置



注:提前在數據庫中創建py.blog庫

3.models.py中創建數據的對象  生成數據庫表(模型類必須繼承models.Model類或子類)

 
from django.db import models

# Create your models here.
class BlogUser(models.Model):
    userName=models.CharField(max_length=20)
    passWord=models.CharField(max_length=20)

4.執行manage.py的shell命令 用快捷鍵Ctrl+Alt+R進入

<1>


目錄中出現


<2>


<3>


查看數據庫


5.在exercise模塊下的urls.py中的urlpatterns下添加匹配元素

include的目的作爲命令空間項目基本exercise下的urls.py和blog_user下的urls.py聯繫起來

命名空間 django中的路由系統和其他語言的框架有所不同,在django中每一個請求的url都有一條路有映射,這樣才能將請求交給對一個的view中的函數去處理,其他大部分的Web框架則是對一類的url請求做一條路有映射,從而使路由系統變得簡潔

路由是關聯url及其處理函數關係的過程.Django的url路由都寫在urls.py文件中的urlpatterns列表中

補充說明:

urlpatterns中的path()處理字符串函數  re_path處理正則表達式路由

語法:

urlpatterns=[

    path(route,views.函數名,向處理函數提供的額外參數,以字典形式表示,該URL模式的別名)

    re_path(正則表達式,view.對應的處理函數)]

其中正則表達式可以看做字符串的模式

Django支持三種表達route:

<1>精確字符串格式:user/2017/   一個精確URL匹配一個操作函數;最簡單的形式,適合對靜態URL的響應;URL字符串不以'/'開頭,但要以'/'結尾

<2>Django的轉換格式<類型:變量名> 格式如:articles/<int:id>/   是一個URL模板,匹配URL同時在其中獲得一批變量作爲參數;是一種常用形式,目的是通過URL進行參數獲取和傳遞

轉換格式類型說明
Str匹配除分隔符(/)外的非空字符,默認類型<year>等價於<str year>
Int匹配0和正整數
Slug匹配字母  數字 橫槓 下劃線組成的字符串,str的子集
Uuid匹配格式化的UUID
path匹配任何非空字符串,包括路徑分隔符,是全集
  

<3>正則表達式: articles/?p<year>[0-9]{4}/ 藉助正則表達式豐富語法表達一類URL(而不是一個);可以通過<>提取變量作爲處理函數的參數,高級語法

 
from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('user/',include('blog_user.urls',namespace='user'))
]

6.在blog_user模塊中創建python文件urls.py並添加匹配代碼

#usr/bin/python
#-*-coding:utf-8-*-
from django.urls import path
from blog_user import views
app_name='user'
urlpatterns = [
    path('register',views.register)]

7.在views.py中添加函數

 
from django.shortcuts import render

# Create your views here.
def register(request):#用來處理http請求
    return render(request,'user/register.html',{})

運行項目


點擊進入瀏覽器


四、爲簡單的註冊頁面添加條件

1.將註冊頁面的提交請求設置爲POST請求

action=" " 制定了表單提交的地址,也就是提交到那個頁面  引號填寫的是處理頁面的地址,相對路徑.或者http絕對路徑

jango對POST請求需要csrf_token驗證,後端會檢測前端發過來的token,如果有問題可以會出現403Forbidden的錯誤。這個token是由後端在頁面GET請求頁面文件的時候就放進去的,可以在模板中使用{%csrf_token%}

 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form method="post" action="/user/register">#"/"代表根目錄必須加上
    {% csrf_token %}
    <p>
        用戶名:<input type="text">
    </p>
    <p>
        密碼:<input type="password">
    </p>
    <p>
        <input type="submit" value="註冊">
    </p>
</form>
</body>
</html>

2.對註冊內容進行保存,提交後跳轉頁面並出現註冊的內容

在views.py文件的展示weicome頁面的代碼行中加入{'key':value}

views.py

 
from django.shortcuts import render

# Create your views here.
from blog_user.models import BlogUser
def register(request):#用來處理請求註冊的命令
    #做一個區分  get post 請求類別

    # 如果得到請求命令爲GET類型,進入註冊頁面
    if request.method=='GET':
        return render(request,'user/register.html',{})
    #如果請求命令爲POST,進入歡迎頁面
    elif request.method=='POST':
        #數據庫數據的保存操作
        #創建一個用戶/數據庫 表對象模型
        bloguser=BlogUser()#導入models.py下的BlogUser對象
        #根據表單中的用戶名name  密碼name 來獲取
        #並加入數據庫中的userName和passWord列中
        bloguser.userName=request.POST.get('username')
        bloguser.passWord=request.POST.get('upw')
        #數據保存
        bloguser.save()
        #給頁面插出入數據 形式爲'key':value
        return render(request, 'user/welcome.html', {'blog':bloguser})

welcome.html

在html文本中加入Djanggo數據內容(腳本) 語法:{{'key',userName}}(userName 是 對象即value下的姓名列)

 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <h1>註冊成功,歡迎{{ blog.userName }}訪問本頁面</h1>
</body>
</html>

執行命令 進入瀏覽器可以看到


跳轉後


數據庫數據


3.解決用戶名重複的問題,

在Web開發中頁面響應方式分爲兩種

<1>轉發:一次請求和響應,請求的地址沒有發生變化,如果此時刷新頁面,就會出現重做現象

               在服務器內部共享同一次請求資源並把內部資源隱式響應給客戶端

<2>重定向:一次以上的請求和響應,請求地址發生一次以上的變化時,如果此時刷新頁面就不會出現重做現象.同一次請求不共享

如果不做重定向的話,我們在提交用戶名和密碼的時候,這時候點刷新,用戶名和密碼就會一直提交,如果數據庫沒有做限制的話,那麼就會出現多個相同的用戶名和密碼

要解決這個問題,首先我們需要在views.py裏面導入redirect和reverse模塊,然後需要在我們刷新的時候跳轉到另一個頁面,我們在裏面創建一個welcome()通過用戶的id來顯示在頁面上

 
from django.shortcuts import render,reverse,redirect

# Create your views here.
from blog_user.models import BlogUser
def register(request):
    if request.method=='GET':
        #轉發
        return render(request,'user/register.html',{})
    elif request.method=='POST':
        bloguser=BlogUser()
        bloguser.userName=request.POST.get('username')
        bloguser.passWord=request.POST.get('upw')
        #數據保存
        bloguser.save()
        #重定向
        return redirect(reverse('user:welcome',args=[bloguser.id]))
#用來處理welcome 請求
def welcome(request,id):
    #根據請求帶參的那個id獲取數據庫信息
    bloguser=BlogUser.objects.get(pk=id)
    return render(request, 'user/welcome.html', {'blog': bloguser})

然後修改blog_user 下的urls.py

 
#usr/bin/python
#-*-coding:utf-8-*-
from django.urls import path
from blog_user import views
app_name='user'
urlpatterns = [
    path('register',views.register),
    path('welcome/<int:id>/',views.welcome,name='welcome')]

我們要修改models.py的內容(數據冗餘:1.數據庫約束  唯一約束  2.通過代碼)

models.py

 
from django.db import models

# Create your models here.
class BlogUser(models.Model):
    userName=models.CharField(max_length=20,unique=True)
    passWord=models.CharField(max_length=20)

但這是我們的數據庫並沒有發生變化,因爲我們數據庫已經有重複的用戶名了,已經違背了原則,所以我們可以將數據庫生成連個表全都刪去然後重新創建表用快捷鍵CTRL+ALET+R

分別執行代碼:makemigrations blog_user

因爲我們已經有了0001這個表,所以這次生成的是0002

sqlmigrate blog_user 0002

migrate blog_user 0002

執行代碼進入頁面後註冊同樣的名字將會報錯


解決報錯並返回註冊頁面提示用戶名已存在

在views.py中通過try:....except:...處理報錯

 
from django.shortcuts import render,reverse,redirect

# Create your views here.
from blog_user.models import BlogUser
def register(request):
    if request.method=='GET':
        #轉發
        return render(request,'user/register.html',{})
    elif request.method=='POST':
        bloguser=BlogUser()
        bloguser.userName=request.POST.get('username')
        bloguser.passWord=request.POST.get('upw')
        try:
            bloguser.save()#在數據保存時判斷是否報錯
            return redirect(reverse('user:welcome',args=[bloguser.id]))
        except:
            return render(request, 'user/register.html', {'blog': bloguser,'error':'用戶名重複'})
#用來處理welcome 請求
def welcome(request,id):
    #根據請求帶參的那個id獲取數據庫信息
    bloguser=BlogUser.objects.get(pk=id)
    return render(request, 'user/welcome.html', {'blog': bloguser})

welcome.html

 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form method="post" action="/user/register">
    {% csrf_token %}
    <p>
        {{ error }}
    </p>
    <p>
        用戶名:<input value="{{blog.userName}}" type="text" name="username">
    </p>
    <p>
        密碼:<input type="password" name="upw">
    </p>
    <p>
        <input type="submit" value="註冊">
    </p>
</form>
</body>
</html>
進入瀏覽器接着輸入張三後出現

                                                                                                                                      

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章