1. 程式人生 > >Django框架第一篇基礎

Django框架第一篇基礎

一個小問題:

什麼是根目錄:就是沒有路徑,只有域名、。url(r'^$')

補充一張關於wsgiref模組的圖片

一、MTV模型

Django的MTV分別代表:

  Model(模型):和資料庫相關的,負責業務物件與資料庫的物件(ORM)

  Template(模板):放所有的html檔案

              模板語法:目的是將白變數(資料庫的內容)如何巧妙的嵌入到html頁面中

  View(檢視):負責業務邏輯,並在適當的時候呼叫Model和Template

  此外,Django還有一個URL分發器。它的作用是將一個個URL的頁面請求分別發給不同的Views處理,Vie

ws再呼叫相應的Model和Template。

二、Django基本命令

1、下載Django:

pip3 install django

2、建立一個Django物件

django-admin.py  startproject   專案名稱
django-admin.py  startproject    mysite

建立成功後會生成這樣一個工程。目錄結構如下:

  • manage.py------啟動檔案 (Django專案裡面的工具,通過它可以呼叫Django shell的數目和資料庫等)
  • settings.py------包含了專案的一些設定,包括資料庫資訊、除錯標
    志以及其他一些工作的變數。
  • urls.py-----------路徑與檢視函式的對映關係

3、建立一個應用

python3 manage.py startapp blog(應用名稱)

建立成功後會生成這樣一個工程。目錄結構如下:

4、啟動Django專案

python3 manage.py runserver  8080

這樣我們的django就啟動起來了!當我們訪問:http://127.0.0.1:8080/時就可以看到:

5、建立表命令

python3 manage.py makemigrations

python3 manage.py migrate

三、檢視層之路由配置系統(views)

URL配置(URLconf)就像Django所支撐網站的目錄。它的本質是URL與要為該URL呼叫的檢視函式之間的對映表;

你就是以這種方式告訴Django,對於這個URL呼叫這段程式碼,對於那個URL呼叫那段程式碼。

'''
    
    urlpatterns = [
          re_path(正則匹配, views檢視函式,引數,別名),
             path(完全匹配, views檢視函式,引數,別名),
       ] 
引數說明: 一個正則表示式字串 一個可呼叫物件,通常為一個檢視函式或一個指定檢視函式路徑的字串
可選的要傳遞給檢視函式的預設引數(字典形式) 一個可選的name引數 '''

URLconf的正則字串引數

1、簡單配置

from django.conf.urls import re_path

from . import views

urlpatterns = [
    re_path(r'^articles/2003/$', views.special_case_2003),
    re_path(r'^articles/([0-9]{4})/$', views.year_archive),
    re_path(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
    re_path(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]

注意幾點:

'''
    NOTE:
1、一旦匹配成功則不再繼續
2、若要從URL 中捕獲一個值,只需要在它周圍放置一對圓括號。
3、不需要新增一個前導的反斜槓,因為每個URL 都有。例如,應該是^articles 而不是 ^/articles。
4、每個正則表示式前面的'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 re_path

urlpatterns = [
  #無名分組
    re_path(r'^article/\d{4}', views.year) ,

    re_path(r'^article/(\d{4})$', views.year2),
    如果有多個匹配一樣的時候,誰放在上面就匹配誰,上面的就會把下面的覆蓋了
    正則加上括號,就是分組,會把分組的內容作為year2函式的引數傳進去
    re_path(r'^article/(\d{4})/(\d{2})$', views.year_month),

    # 有名分組(就是給分組起個名字,這樣定義的好處就是按照關鍵字引數去傳參了,指名道姓的方式)
    re_path(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 會更加明晰且不容易產生引數順序問題的錯誤 —— 你可以在你的檢視函式定義中重新安排引數的順序。當

然,這些好處是以簡潔為代價;有些開發人員認為命名組語法醜陋而繁瑣

四、檢視層之檢視函式(views)

一個檢視函式,簡稱檢視,是一個簡單的Python 函式,它接受Web請求並且返回Web響應。響應可以是一張網頁的HTML內容,一個重定向,一

個404錯誤,一個XML文件,或者一張圖片. . . 是任何東西都可以。無論檢視本身包含什麼邏輯,都要返回響應。程式碼寫在哪裡也無所謂,只要它

在你的Python目錄下面。除此之外沒有更多的要求了——可以說“沒有什麼神奇的地方”。為了將程式碼放在某處,約定是將檢視放置在專案或應用程式目錄中的名為views.py的檔案中。

一個簡單的檢視函式

-----views.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))

注意:檢視會返回一HttpResponse物件,其中包含生成的響應。每個檢視函式都負責返回一個HttpResponse物件

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。

五、模型層(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

def index(request):
    import datetime
    s="hello"
    l=[111,222,333]    # 列表
    dic={"name":"yuan","age":18}  # 字典
    date = datetime.date(1993, 5, 2)   # 日期物件
 
    class Person(object):
        def __init__(self,name):
            self.name=name
 
    person_yuan=Person("yuan")  # 自定義類物件
    person_egon=Person("egon")
    person_alex=Person("alex")
 
    person_list=[person_yuan,person_egon,person_alex]
 
 
    return render(request,"index.html",{"l":l,"dic":dic,"date":date,"person_list":person_list}) 

template: 

<h4>{{s}}</h4>
<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>

小練習:

需求:當用戶輸入一個URL:  http://127.0.0.1:8080/timer,就返回給使用者一個當前的時間

基本流程

1、對urls進行一個設定