灌輸:html
什麼是根目錄:就是沒有路徑,只有域名。 url(r」^$」)python
1、 MVT模型web
Django的MVT模型正則表達式
- Model(模板):和數據庫相關,負責業務對象與數據庫的對象(ORM)shell
- Template(模板):數據庫
放全部的HTML文件django
模板語言:目的是將白變量(數據庫的內容)如何巧妙的嵌入到html頁面中。cookie
- View(視圖):負責業務邏輯,並在適當的時候調用Model和Templatesession
此外,Django還有一個URL分發器。他的做用是將一個個的URL的頁面請求分別發給不一樣的View處理,View再調用相應的Model和Template。數據結構
2、 建立Django項目
- 建立第一個Django項目
- 一、命令行 Django-admin startproject first_Django
- 二、
Pycharm建立- file -> new Project ->右側選Django -> 選好路徑->選好環境-> 名字app -> 在新的窗口打開文件
- 三、啓動項目
- 命令行啓動
- python manage.py runserver 127.0.0.1:8090(改端口這樣指定)
- pycharm啓動
- 框中選項爲項目名->讓後點擊啓動按鈕(右上角)(若是想改就在旁邊點編輯-就能夠改端口等
- 建立一個應用
-python3 manage.py startapp blog(應用名稱)
3、 視圖層之路由配置系統(View)
-URL配置(URLconf)就像Django所支撐網站的目錄。它的本質是URL與要爲該URL調用的視圖函數之間的映射表;
-你就是以這種方式告訴Django,對於這個URL調用這段代碼,對於那個URL調用那段代碼。
urlpatterns = [
url(正則表達式, views視圖函數,參數,別名),
]
參數說明:
一個正則表達式字符串
一個可調用對象,一般爲一個視圖函數或一個指定視圖函數路徑的字符串
可選的要傳遞給視圖函數的默認參數(字典形式)
一個可選的name參數
URLconf的正則字符串參數
一、 簡單配置
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^articles/2003/$', views.special_case_2003),
url(r'^articles/([0-9]{4})/$', views.year_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]
注意:
NOTE:
一、一旦匹配成功則再也不繼續
二、若要從URL 中捕獲一個值,只須要在它周圍放置一對圓括號。
三、不須要添加一個前導的反斜槓,由於每一個URL 都有。例如,應該是^articles 而不是 ^/articles。
四、每一個正則表達式前面的'r' 是可選的可是建議加上。
一些請求的例子:
/articles/2005/3/ 不匹配任何URL 模式,由於列表中的第三個模式要求月份應該是兩個數字。
/articles/2003/ 將匹配列表中的第一個模式不是第二個,由於模式按順序匹配,第一個會首先測試是否匹配。
/articles/2005/03/ 請求將匹配列表中的第三個模式。Django 將調用函數
views.month_archive(request, '2005', '03')。
設置項是否開啓URL訪問地址後面不爲/跳轉至帶有/的路徑
APPEND_SLASH = True
無名分組和有名分組
上面的示例使用簡單的、沒有命名的正則表達式組(經過圓括號)來捕獲URL 中的值並以位置 參數傳遞給視圖。
在更高級的用法中,可使用命名的正則表達式組來捕獲URL中的值並以關鍵字 參數傳遞給視圖。
在Python 正則表達式中,命名正則表達式組的語法是(?P<name>pattern),其中name 是組的名稱,pattern 是要匹配的模式。
from app02 import views
from django.conf.urls import url
urlpatterns = [
#無名分組
url(r'^article/\d{4}', views.year) ,
url(r'^article/(\d{4})$', views.year2),
若是有多個匹配同樣的時候,誰放在上面就匹配誰,上面的就會把下面的覆蓋了
正則加上括號,就是分組,會把分組的內容做爲year2函數的參數傳進去
url(r'^article/(\d{4})/(\d{2})$', views.year_month),
# 有名分組(就是給分組起個名字,這樣定義的好處就是按照關鍵字參數去傳參了,指名道姓的方式)
url(r'^article/(?P<year>\d{4})/(?P<month>\d{2})$', views.year_month_hasname)
]
捕獲的值做爲關鍵字參數而不是位置參數傳遞給視圖函數。例如:
/articles/2005/03/
請求將調用views.month_archive(request, year=’2005’, month=’03’)函數
在實際應用中,這意味你的URLconf 會更加明晰且不容易產生參數順序問題的錯誤—— 你能夠在你的視圖函數定義中從新安排參數的順序。固然,這些好處是以簡潔爲代價;有些開發人員認爲命名組語法醜陋而繁瑣。
4、 視圖層之視圖函數(views)
一個視圖函數,簡稱視圖,是一個簡單python函數,他接收web請求且返回web響應。響應能夠是一張網頁的HTML內容,一個重定向,一個XML文檔,或者一張圖片。。是什麼均可以。不管視圖包含什麼邏輯,都要返回響應。代碼寫在哪裏也無所謂,只要它在你的Python目錄下面。除此以外沒有更多的要求了——能夠說「沒有什麼神奇的地方」。爲了將代碼放在某處,約定是將視圖放置在項目或應用程序目錄中的名爲views.py的文件中。
一個簡單的視圖函數
----view.py
from django.shortcuts import render,HttpResponse
# Create your views here.
def year(request): # request參數請求全部的參數,這個參數必定要有
return HttpResponse("ok") #每個視圖函數必須有return
def year2(request,year):
print(year)
return HttpResponse("hello") #返回的必定是一個字符串,若是你想return純字符串,就用HttpResponse方法
def year_month(request,year,month):
print(year,month)
# 返回的是匹配的年和月拼接的結果
return HttpResponse(year+month) #
def year_month_hasname(request,month,year):
# return HttpResponse("ok")
print(year,month)
return HttpResponse("month是:%s,year是:%s"%(month,year))
注意:視圖會返回一個HttpRequest對象,其中包含生成的響應。每一個視圖函數都負責返回一個HTTPRequest對象。
HTTPRequest對象
屬性:
path: 請求頁面的全路徑,不包括域名
method: 請求中使用的HTTP方法的字符串表示。全大寫表示。例如
if req.method=="GET":
do_something()
elif req.method=="POST":
do_something_else()
GET: 包含全部HTTP GET參數的類字典對象
POST: 包含全部HTTP 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()
注意:鍵值對的值是多個的時候,好比checkbox類型的input標籤,select標籤,須要使用:
request.POST.getlist(「hobby」)
Render 函數
render(request, template_name[, context])
結合一個給定的模板和一個給定的上下文字典,並返回一個渲染後的HttpResponse 對象。
參數:
request: 用於生成響應的請求對象。
template_name:要使用的模板的完整名稱,可選的參數
context:添加到模板上下文的一個字典。默認是一個空字典。若是字典中的某個值是可調用的,視圖將在渲染模板以前調用它。
content_type:生成的文檔要使用的MIME類型。默認爲DEFAULT_CONTENT_TYPE 設置的值。
status:響應的狀態碼。默認爲200。
5、模型層(Template)
python的模板:HTML代碼+模板語法
模板包括在使用時會被值替換掉的變量,和控制模板邏輯的標籤、
例子:
def current_time(req):
# ================================原始的視圖函數
# import datetime
# now=datetime.datetime.now()
# html="<html><body>如今時刻:<h1>%s.</h1></body></html>" %now
# ================================django模板修改的視圖函數
# from django.template import Template,Context
# now=datetime.datetime.now()
# t=Template('<html><body>如今時刻是:<h1>{{current_date}}</h1></body></html>')
# #t=get_template('current_datetime.html')
# c=Context({'current_date':str(now)})
# html=t.render(c)
#
# return HttpResponse(html)
#另外一種寫法(推薦)
import datetime
now=datetime.datetime.now()
return render(req, 'current_datetime.html', {'current_date':str(now)[:19]})
模板語法:目的是將變量(數據庫的內容)如何巧妙的嵌入到html頁面中(就不用以前的字符串拼接了)
在Django模板中遍歷複雜數據結構的關鍵是句點字符:
語法:{{var_name}}
view.py
import datetime
s="hello"
l=[111,222,333] # 列表
dic={"name":"jack","age":18} # 字典
date = datetime.date(1993, 5, 2) # 日期對象
class Person(object):
def __init__(self,name):
self.name=name
person_yuan=Person("aa") # 自定義類對象
person_egon=Person("bb")
person_alex=Person("cc")
person_list=[person_aa,person_bb,person_cc]
return render(request,"index.html",{"l":l,"dic":dic,"date":date,"person_list":person_list})
template:
<h4>列表:{{ l.0 }}</h4>
<h4>列表:{{ l.2 }}</h4>
<h4>字典:{{ dic.name }}</h4>
<h4>日期:{{ date.year }}</h4>
<h4>類對象列表:{{ person_list.0.name }}</h4>
注意:句點符也能夠用來引用對象的方法(無參數方法)
<h4>字典:{{ dic.name.upper }}</h4>