第一篇:Django基础
Django框架第一篇基礎
一個小問題:
什么是根目錄:就是沒有路徑,只有域名、。url(r'^$')
補充一張關于wsgiref模塊的圖片
?
一、MTV模型
Django的MTV分別代表:
Model(模型):和數據庫相關的,負責業務對象與數據庫的對象(ORM)
Template(模板):放所有的html文件
模板語法:目的是將白變量(數據庫的內容)如何巧妙的嵌入到html頁面中
View(視圖):負責業務邏輯,并在適當的時候調用Model和Template
此外,Django還有一個URL分發器。它的作用是將一個個URL的頁面請求分別發給不同的Views處理,Views再調用相應的Model和Template。
二、Django基本命令
1、下載Django:
pip3 install django2、創建一個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 makemigrationspython3 manage.py migrate?
6
7、
8、
9、
10、待續
三、視圖層之路由配置系統(views)
URL配置(URLconf)就像Django所支撐網站的目錄。它的本質是URL與要為該URL調用的視圖函數之間的映射表;
你就是以這種方式告訴Django,對于這個URL調用這段代碼,對于那個URL調用那段代碼。
'''urlpatterns = [url(正則表達式, views視圖函數,參數,別名), ]參數說明:一個正則表達式字符串一個可調用對象,通常為一個視圖函數或一個指定視圖函數路徑的字符串可選的要傳遞給視圖函數的默認參數(字典形式)一個可選的name參數'''URLconf的正則字符串參數
1、簡單配置
from django.conf.urls import urlfrom . import viewsurlpatterns = [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: 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 urlurlpatterns = [#無名分組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 會更加明晰且不容易產生參數順序問題的錯誤 —— 你可以在你的視圖函數定義中重新安排參數的順序。當然,這些好處是以簡潔為代價;有些開發人員認為命名組語法丑陋而繁瑣。
四、視圖層之視圖函數(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 Typecontent: 上傳文件的原始內容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 datetimenow=datetime.datetime.now()return render(req, 'current_datetime.html', {'current_date':str(now)[:19]})模板語法: 目的是將變量(數據庫的內容)如何巧妙的嵌入到html頁面中(就不用之前我們用的字符串拼接了)
在 Django 模板中遍歷復雜數據結構的關鍵是句點字符 ?.
語法:
{{var_name}}view.py
def index(request):import datetimes="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=nameperson_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進行一個設置
2、views.py
3、在template里創建一個timer.html頁面
六、模板層基礎(model)
七、模型層進階(model)
轉載于:https://www.cnblogs.com/hanbowen/p/9548157.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的第一篇:Django基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Nginx的upstream_respo
- 下一篇: 详解vue生命周期