Django <二>
Django URL(路由系統)
RL配置(URLconf)就像Django 所支撐網站的目錄。它的本質是URL模式以及要為該URL模式調用的視圖函數之間的映射表;你就是以這種方式告訴Django,對於這個URL調用這段代碼,對於那個URL調用那段代碼。
1 urlpatterns = [ 2 url(正則表達式, views視圖函數,參數,別名), 3 ]
參數說明:
- 一個正則表達式字符串
- 一個可調用對象,通常為一個視圖函數或一個指定視圖函數路徑的字符串
- 可選的要傳遞給視圖函數的默認參數(字典形式)
- 一個可選的name參數
一、url無名分組之 url參數一
1、 url路由有優先級的
2、 在正則表達式中如果加上括號就是分組了,分組就是一個對象了,就需要一個變量來接收這個對象,這裏就是接收寫入的url
views文件視圖函數
def special_case_2003(req): return HttpResponse("2003") def month_archive(req,y,m): return HttpResponse(y+"year"+m+"mouth")View Code
urls路由系統無名分組
from django.conf.urls import url fromView Codedjango.contrib import admin from app01 import views urlpatterns = [ url(r‘^admin/‘, admin.site.urls), url(r"^cur_time/",views.cur_time), url(r"^userInfo/",views.userInfo), 1、#這個用戶連接http://127.0.0.1:8000/articles/2003/ 就能夠顯示視圖函數的內容 url(r‘^articles/2003/$‘, views.special_case_2003), 2、# http://127.0.0.1:8000/articles/正則匹配的/正則匹配的/ 就能夠顯示視圖函數url(r‘^articles/([0-9]{4})/([0-9]{2})/$‘, views.month_archive), ]
1、上面用戶連接1這個鏈接,這個是絕對匹配,就會經過視圖函數返回2003
2、中的url由於分了兩個組,也就相當於對象,所以要在視圖函數中用變量來接收這個對象,並且在url中匹配。這裏返回給用戶輸入的連接加上year和mouth
二、url有名分組之 url參數二
The above example used simple, non-named regular-expression groups (via parenthesis) to capture bits of the URL and pass them as positional arguments to a view. In more advanced usage, it’s possible to use named regular-expression groups to capture URL bits and pass them as keyword arguments to a view.
In Python regular expressions, the syntax for named regular-expression groups is (?P<name>pattern)
, where name
is the name of the group and pattern
is some pattern to match.
Here’s the above example URLconf, rewritten to use named groups:
簡單說明補充:
re=re.search(‘(?P<id>\d{3})/(?P<name>\w{3})’,’wwee32tt123/ooo’ )
(?P<id>\d{3} 這裏就是把這個組命名為id
?P<name>\w{3} 這裏就是把這個組命名為name
print(re.group()) #123/ooo
print(re.goup(id)) #123
在urls中寫入:
url(r"^articles/(?P<year>[0-9]{4})/(?P<mouth>[0-9]{2})/$",views.mouth)View Code
然後在views中寫入視圖函數:
def mouth(req,year,mouth): return HttpResponse(year+"year"+mouth+"mouth")View Code
這裏的year就是匹配的urls中的路徑,mouth就是前面url中的路徑,這裏的year和mouth必須要和urls中的對應
訪問http://127.0.0.1:8000/articles/2003/43/
就能在前端出現 2003year43mouth
其實就是把url參數一的對象命名了而已
三、url參數三、
一、在urls中添加第三個參數
url(r"^index",views.index,{"name":"pyrene"})
然後在views中寫上視圖函數
def index(req,name): return HttpResponse(name)
註意:
這裏的視圖函數中必須把urls中的第三個參數的key傳入到這裏面,並且要和urls中的key的名字一模一樣
然後訪問index頁面就會返回給瀏覽器pyrene
二、如果在urls中的第三個參數前面有分組並且分組的組名和第三個參數的key相同,那麽用戶訪問瀏覽器的時候就會把覆蓋掉分組需要返回來的內容
url(r"^index/(?P<name>[0-9]{4})/$",views.index,{"name":"pyrene"})urls
views視圖函數不變
用戶訪問
http://127.0.0.1:8000/index/2000/
瀏覽器顯示:pyrene 而不是2000
原因是被後面的第三個參數覆蓋掉了
應用:
這裏的作用可以把幾個相同連接,然後加上第三個參數來返回不同的內容
四、url第四個參數
應用:防止修改跳轉form路徑,造成大量的復雜操作
小知識:
輸入form的時候點擊tab就會直接把form快捷鍵出來
urls文件,首先設置別名
url(r"^index/",views.index,name="pyrene")
在templates裏面添加login.html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {#<form action="/index/" method="post">#} <form action="{% url "pyrene" %}" method="post"> <input type="text" name="username"/> <input type="password" name="pwd"/> <input type="submit" value="submit"> </form> </body> </html>View Code
views視圖函數:
def index(req): if req.method=="POST": username=req.POST.get("username",None) pwd=req.POST.get("pwd",None) if username=="aa"and pwd=="123": return HttpResponse("登錄成功") return render(req,"login.html")View Code
然後用戶輸入http://127.0.0.1:8000/index/
輸入用戶名密碼,提交就能登錄成功
原因:
1、 首先在urls裏面設置了form跳轉的別名
2、 在login的前端文件中設置模板語言
3、 然後用戶點擊提交,前端模板語言就代表了urls的正則匹配的路徑,所以能跳轉找到views視圖函數
參數四的應用:
由於後端測試等需要更改前端與後端的路徑名字,所以這裏設置別名就不用更改前端的form跳轉的路徑。避免了復雜操作
url關於別名補充
1、這裏的別名是用戶連接的時候就已經在後臺替換了別名
五、url映射分發
應用背景:
由於一個大型網站有很多個頁面,成千上萬個,如果把這些頁面路由放到全局的urls裏面,那樣會造成很多麻煩,所以路由映射分發就出現了
思想:
利用分級的方式,首先在全局urls分發器中分別分發給下面不同功能層級進行urls選
用include
1、 在全局urls中操作 導入include,然後分發層級
from django.conf.urls import url,include #這裏導入include from django.contrib import admin from app01 import views urlpatterns = [ url(r‘^admin/‘, admin.site.urls), url(r"^app01/",include("app01.urls")),] #分發層級View Code
2、 在app01這個項目功能中創建urls
#!/usr/bin/env python # -*- coding:utf-8 -*- from django.conf.urls import url,include from django.contrib import admin from app01 import views urlpatterns = [ url(r"^new/story/$",views.introduce) ]View Code
3、 在views視圖函數中寫入
def introduce(req): return HttpResponse("ok")View Code
用戶訪問http://127.0.0.1:8000/app01/new/story/
流程:首先在項目全局中設置include、urls分發,然後在下面功能中設置urls連接views視圖函數。
Django views(視圖函數)
http請求中產生兩個核心對象:
http請求:HttpRequest對象
http響應:HttpResponse對象
所在位置:django.http
之前我們用到的參數request就是HttpRequest 檢測方法:isinstance(request,HttpRequest)
1 HttpRequest對象的屬性和方法:
path: 請求頁面的全路徑,不包括域名 # # method: 請求中使用的HTTP方法的字符串表示。全大寫表示。例如 # # if req.method=="GET": # # do_something() # # elseif req.method=="POST": # # do_something_else() # # GET: 包含所有HTTP GET參數的類字典對象 # # POST: 包含所有HTTP POST參數的類字典對象 # # 服務器收到空的POST請求的情況也是可能發生的,也就是說,表單form通過 # HTTP POST方法提交請求,但是表單中可能沒有數據,因此不能使用 # if req.POST來判斷是否使用了HTTP POST 方法;應該使用 if req.method=="POST" # # # # COOKIES: 包含所有cookies的標準Python字典對象;keys和values都是字符串。 # # FILES: 包含所有上傳文件的類字典對象;FILES中的每一個Key都是<input type="file" name="" />標簽中 name屬性的值,FILES中的每一個value同時也是一個標準的python字典對象,包含下面三個Keys: # # filename: 上傳文件名,用字符串表示 # content_type: 上傳文件的Content Type # content: 上傳文件的原始內容 # # # user: 是一個django.contrib.auth.models.User對象,代表當前登陸的用戶。如果訪問用戶當前 # 沒有登陸,user將被初始化為django.contrib.auth.models.AnonymousUser的實例。你 # 可以通過user的is_authenticated()方法來辨別用戶是否登陸: # if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware # 時該屬性才可用 # # session: 唯一可讀寫的屬性,代表當前會話的字典對象;自己有激活Django中的session支持時該屬性才可用。 #方法 get_full_path(), 比如:http://127.0.0.1:8000/index33/?name=123 ,req.get_full_path()得到的結果就是/index33/?name=123 req.path:/index33View Code
註意一個常用方法:request.POST.getlist(‘‘)
2 HttpResponse對象:
對於HttpRequest對象來說,是由django自動創建的,但是,HttpResponse對象就必須我們自己創建。每個view請求處理方法必須返回一個HttpResponse對象。
HttpResponse類在django.http.HttpResponse
在HttpResponse對象上擴展的常用方法:
頁面渲染: render()(推薦)<br> render_to_response(), 頁面跳轉: redirect("路徑") locals(): 可以直接將函數中所有的變量傳給模板
Django Models
數據庫的配置
1 django默認支持sqlite,mysql, oracle,postgresql數據庫。
<1> sqlite
django默認使用sqlite的數據庫,默認自帶sqlite的數據庫驅動 , 引擎名稱:django.db.backends.sqlite3
<2> mysql
引擎名稱:django.db.backends.mysql
2 mysql驅動程序
- MySQLdb(mysql python)
- mysqlclient
- MySQL
- PyMySQL(純python的mysql驅動程序)
3 在django的項目中會默認使用sqlite數據庫,在settings裏有如下設置:
如果我們想要更改數據庫,需要修改如下:
DATABASES = { ‘default‘: { ‘ENGINE‘: ‘django.db.backends.mysql‘, ‘NAME‘: ‘books‘, #你的數據庫名稱 ‘USER‘: ‘root‘, #你的數據庫用戶名 ‘PASSWORD‘: ‘‘, #你的數據庫密碼 ‘HOST‘: ‘‘, #你的數據庫主機,留空默認為localhost ‘PORT‘: ‘3306‘, #你的數據庫端口 } }View Code
NAME即數據庫的名字,在mysql連接前該數據庫必須已經創建,而上面的sqlite數據庫下的db.sqlite3則是項目自動創建
USER和PASSWORD分別是數據庫的用戶名和密碼。
設置完後,再啟動我們的Django項目前,我們需要激活我們的mysql。
然後,啟動項目,會報錯:no module named MySQLdb
這是因為django默認你導入的驅動是MySQLdb,可是MySQLdb對於py3有很大問題,所以我們需要的驅動是PyMySQL
所以,我們只需要找到項目名文件下的__init__,在裏面寫入:
import pymysql
pymysql.install_as_MySQLdb()
問題解決!
Django同步mysql操作
一、
二、 為了更好的查詢修改數據庫如下操作:
三、然後安裝mysql的驅動(driver),點擊ok
四、點擊輸入mysql賬號密碼,點擊more可以查看其它的庫文件
五、Django項目默認使用sqlite數據庫,讓其只是mysql需要在項目中的settings中如下設置
首先讓支持sqlite的設置註釋掉,然後添加上支持mysql的設置 # DATABASES = { # ‘default‘: { # ‘ENGINE‘: ‘django.db.backends.sqlite3‘, # ‘NAME‘: os.path.join(BASE_DIR, ‘db.sqlite3‘), # } # } DATABASES = { ‘default‘: { ‘ENGINE‘: ‘django.db.backends.mysql‘, ‘NAME‘: ‘a1‘, ‘USER‘:‘root‘, ‘PASSWORD‘:‘123456‘, ‘HOST‘:‘‘, ‘PORT‘:‘3306‘, } }
註意點:
創建數據庫之後註冊APP,也就是把“部門”在最後加入,如下“app01” INSTALLED_APPS = [ ‘django.contrib.admin‘, ‘django.contrib.auth‘, ‘django.contrib.contenttypes‘, ‘django.contrib.sessions‘, ‘django.contrib.messages‘, ‘django.contrib.staticfiles‘, ‘app01‘, ]
說明:
詳細解釋: DATABASES = { ‘default‘: { ‘ENGINE‘: ‘django.db.backends.mysql‘, ‘NAME‘: ‘books‘, #你的數據庫名稱 ‘USER‘: ‘root‘, #你的數據庫用戶名 ‘PASSWORD‘: ‘‘, #你的數據庫密碼 ‘HOST‘: ‘‘, #你的數據庫主機,留空默認為localhost ‘PORT‘: ‘3306‘, #你的數據庫端口 } } 註意點: NAME即數據庫的名字,在mysql連接前該數據庫必須已經創建,而上面的sqlite數據庫下的db.sqlite3則是項目自動創建 USER和PASSWORD分別是數據庫的用戶名和密碼。 設置完後,再啟動我們的Django項目前,我們需要激活我們的mysql。 然後,啟動項目,會報錯:no module named MySQLdb 這是因為django默認你導入的驅動是MySQLdb,可是MySQLdb對於py3有很大問題,所以我們需要的驅動是PyMySQL 所以,我們只需要找到項目名文件下的__init__,在裏面寫入: import pymysql pymysql.install_as_MySQLdb() 問題解決!
MOdel連接數據庫之後還有更多操作,詳情請看下篇
Django <二>