django--MTV基礎模型


今天就進入到python最重要的階段了django框架,框架就像膠水一樣會將我們前面學的所有知識點粘合在一起,所以以前有哪些部分模糊的可以看看前面的隨筆。本篇主要介紹djangoMTV模型,視圖層之路由配置系統(URlconf)和視圖層之視圖函數(views)。

 

本篇導航:

 

一、MTV模型

1、python主要框架:

django:大而全

flask:小而精

2、Django的MTV

Model(模型):數據庫相關的操作(ORM)

Template(模版):模板語法--->將變量(數據庫數據)如何巧妙嵌入html頁面中

View(視圖):邏輯處理

此外,Django還有一個urls分發器:路徑與視圖函數的映射關系

3、關系圖


 

二、django基本命令

1、下載

pip3 install django

2、創建項目

django-admin.py startproject mysite

manage.py ----- Django項目里面的工具,通過它可以調用django shell和數據庫等。

settings.py ---- 包含了項目的默認設置,包括數據庫信息,調試標志以及其他一些工作的變量。

urls.py ----- 負責把URL模式映射到應用程序。

3、創建應用

python manage.py startapp blog

models.py --- 數據庫相關的操作。

tests.py --- 用於測試

views.py --- 用來寫邏輯處理

4、啟動項目

python manage.py runserver IP PORT

IP:可以不寫 不寫默認本機

PORT(端口):可以不寫 不寫默認8000


 

三、視圖層之路由配置系統(URlconf)

功能:建立起url與視圖函數的映射關系。

也就是告訴Django,對於這個URL調用這段代碼,對於那個URL調用那段代碼。

基本格式:

復制代碼
''' urlpatterns = [ url(正則表達式, views視圖函數,參數,別名), ] 參數說明: 一個正則表達式字符串 一個可調用對象,通常為一個視圖函數或一個指定視圖函數路徑的字符串 可選的要傳遞給視圖函數的默認參數(字典形式) 一個可選的name參數 '''
復制代碼

1、簡單舉例

復制代碼
from django.conf.urls import url from 項目 import views urlpatterns = [ url(r'^articles/2003/$', views.special_case_2003), url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive), ]
復制代碼

注意:

''' 一旦匹配成功則不再繼續 只匹配第一個url 若要從URL 中捕獲一個值,只需要在它周圍放置一對圓括號。 不需要添加一個前導的反斜杠,因為每個URL 都有。例如,應該是^articles 而不是 ^/articles。 每個正則表達式前面的'r' 是可選的但是建議加上。 '''

 2、有名分組

復制代碼
1 無名分組   
url(r'^articles/(\d{4})/(\d{2})$', views.year_month) # year(requset,1990,12) 按位置傳參數 2 有名分組 
url(r'^articles/(?P<year>\d{4})/(?P<month>\d{2})$', views.year_month) # year(requset,year=1990,month=12) 按位置傳參數
復制代碼

3、查找方式

在http://www.example.com/myapp/ 請求中,URLconf 將查找myapp/ 。

在http://www.example.com/myapp/?page=3 請求中,URLconf 仍將查找myapp/。

URLconf 不檢查請求的方法。所有的請求方法--> 同一個URL的POST、GET、HEAD等等--> 都將路由到相同的函數。

4、url 分發

如果一個項目中應用太多,導致方法太多耦合性太強,所以我們可以用include進行解耦,在每一個應用中分別建立一個urls

項目中的urls:

復制代碼
from django.conf.urls import include, url from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^blog/', include('blog.urls')), ]
復制代碼

應用中的urls:

復制代碼
from django.conf.urls import url import views urlpatterns = [ url(r'^articles/2003/05$', views.year_month2), # year(requset,1990,12) url(r'^articles/(?P<year>\d{4})/(?P<month>\d{2})$', views.year_month), # year(requset,year=1990,month=12) 按位置傳參數 ]
復制代碼

5、傳遞額外的選項給視圖函數(了解)

django.conf.urls.url() 函數可以接收一個可選的第三個參數,它是一個字典,表示想要傳遞給視圖函數的額外關鍵字參數。

from django.conf.urls import url from . import views urlpatterns = [ url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'foo': 'bar'}), ]

在這個例子中,對於/blog/2005/請求,Django 將調用views.year_archive(request, year='2005', foo='bar')

6、URL 的反向解析(別名)

例如:以下URL(name)

復制代碼
from django.conf.urls import url from django.contrib import admin from app1 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^$', views.login), url(r'^login/', views.login,name="login") ]
復制代碼

你可以在模板的代碼中使用下面的方法獲得它們(提交:action):(模板后面會說到)

復制代碼
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>登錄頁面</h1> <form action="{% url "login" %}" method="post"> <p><input type="text" name="user"></p> <p><input type="password" name="pwd"></p> <p><input type="submit"></p> </form> </body> </html>
復制代碼

這樣當你的匹配規則及路徑發生變動時其他地方不會發生錯誤


  

四、視圖層之視圖函數(views)

1、簡單視圖:

一個視圖函數,簡稱視圖,用來邏輯處理。是一個簡單的Python 函數,它接受Web請求並且返回Web響應。

1)下面是一個返回當前日期和時間作為HTML文檔的視圖:

 

復制代碼
from django.http import HttpResponse import datetime def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html)
復制代碼

 

2)一定包含兩個對象:
requset---->請求信息
Httpresponse---->響應字符串

2、request里包含哪些數據(重點)

復制代碼
request.GET: GET請求的數據    {}
request.POST:POST請求的數據   {}
request.method:請求方式:GET 或 POST
    請求某個鍵下多個值時:
        request.POST.getlist("hobby") request.path : 請求路徑 請求url:http://127.0.0.1:8000/index.html/23?a=1 request.path:/index.html/23 request.get_full_path() 請求url:http://127.0.0.1:8000/index.html/23?a=1 request.get_full_path():/index.html/23?a=1 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支持時該屬性才可用。
復制代碼

3、Httpresponse函數

HttpReponse是服務器接收到瀏覽器的請求后,處理返回結果常用的一個類。主要用於返回字符串。

它是在每次請求中必有的,哪怕你用的是render例如:

復制代碼
def render(request, template_name, context=None, content_type=None, status=None, using=None): """ Returns a HttpResponse whose content is filled with the result of calling django.template.loader.render_to_string() with the passed arguments. """ content = loader.render_to_string(template_name, context, request, using=using) return HttpResponse(content, content_type, status)
復制代碼

render內部函數最終還是返回了HttpResponse

4、render函數

render(request, template_name[, context])

結合一個給定的模板和一個給定的上下文字典,並返回一個渲染后的 HttpResponse 對象。

參數:

request: 用於生成響應的請求對象。

template_name:要使用的模板的完整名稱,可選的參數(也就是我們說的網頁)

context:添加到模板上下文的一個字典。默認是一個空字典。如果字典中的某個值是可調用的,視圖將在渲染模板之前調用它。

content_type:生成的文檔要使用的MIME類型。默認為DEFAULT_CONTENT_TYPE 設置的值。

status:響應的狀態碼。默認為200。

def index(request): name="yuan" return render(request,"index.html",{"n":name})

5、redirect 函數(重定向)

參數可以是:

一個模型:將調用模型的get_absolute_url() 函數

一個視圖,可以帶有參數:將使用urlresolvers.reverse 來反向解析名稱

一個絕對的或相對的URL,將原封不動的作為重定向的位置。

默認返回一個臨時的重定向;傳遞permanent=True 可以返回一個永久的重定向。

def index(request): return redirect("/login.html/")

會從urls中重新走一遍login.html的視圖函數 也可以直接寫地址進行重定向

6、render和resdirect的區別

render: 只是返回頁面內容,但是未發送第二次請求,url未刷新,所以當刷新后又會回到前頁面。

redirect:發送了第二次請求,url更新

if 頁面需要模板語言渲染,需要的將數據庫的數據加載到html,那么render方法則不會顯示這一部分。


 

注意:

使用post請求時需要在settings.py配置文件中注釋一行代碼

復制代碼
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', #'django.middleware.csrf.CsrfViewMiddleware', 就是這行 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
復制代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM