Python Web框架【Django框架第一篇基礎】
阿新 • • 發佈:2018-05-11
界面 博客 make ted 分割 增加 welcom 關系 可選
View(視圖):負責業務邏輯,並在適當的時候調用Model和Template
此外,Django還有一個url分發器,它的作用是將一個個URL的頁面請求分發給不同的view處理,view再調用相應的Model和Template
windows7
1.1、通過cmd命令行到python-3.5.4\Scripts目錄下,執行“pip3.5.exe install Django”命令【註意版本】
D:\辦公軟件\python-3.5.4\Scripts>pip3 install Django==1.11.13
刪除命令 C:\Users\Administrator>pip uninstall Django
1.2、將django命令加入環境變量
【【右鍵計算機】--》【屬性】--》【高級系統設置】--》【高級】--》【環境變量】--》【在第二個內容框中找到 變量名為Path 的一行,雙擊】 --> 【Python安裝目錄追加到變值值中,用 ; 分割】】
D:\辦公軟件\python-3.5.4;D:\辦公軟件\python-3.5.4\Scripts
驗證是否安裝成功
當前目錄下會生成mysite的工程,目錄結構如下:
2.6、訪問http://127.0.0.1:8800/ http://127.0.0.1:8800/blog/ ####################################################################### ######################_______________分割線_______________####################### #######################################################################
1.6【別名name=‘INDEX‘】 設置好別名後;URL怎麽改都不會對項目有影響 urls.py文件
Migrations for ‘blog‘: blog\migrations\0001_initial.py - Create model Books E:\Python\Python自動化開發\day15\Django\Mysite>python manage.py migrate
Operations to perform: Apply all migrations: admin, auth, blog, contenttypes, sessions 註釋【 在你改動了 model.py的內容之後執行下面的命令: python manger.py makemigrations 相當於 在該app下建立 migrations目錄,並記錄下你所有的關於modes.py的改動,比如0001_initial.py, 但是這個改動還沒有作用到數據庫文件 你可以手動打開這個文件,看看裏面是什麽 在此之後執行命令 python manager.py migrate 將該改動作用到數據庫文件,比如產生table之類 】 4.2 ORM之增(create,save)、刪(delete)、改(update和save)、查(filter,value)、 在urls.py裏添加url【這個是總的】
Django框架第一篇基礎【DjangoMTV模式】
老師博客【www.cnblogs.com/yuanchenqi/articles/6811632.html】 同學博客:http://www.cnblogs.com/haiyan123/p/7701412.html Django官網:https://www.djangoproject.com/download/一、安裝Django
DjangoMTV模式 Django的MTV模式本質是各組件之間為了保持松耦合關系,Django的MTV分別代表: Model(模型):負責業務對象與數據庫的對象(ORM) Template(模版):負責如何把頁面展示給用戶刪除命令 C:\Users\Administrator>pip uninstall Django
驗證是否安裝成功
#!/usr/bin/env python # -*- coding:utf-8 -*- import django print(django.get_version()) D:\辦公軟件\python-3.5.4\python.exe E:/Python/Python自動化開發/day15/Django/a.py 1.11.13
二、Django基本命令
2.1、使用命令創建一個Django項目 E:\Django_project>django-admin startproject mysite當前目錄下會生成mysite的工程,目錄結構如下:
- manage.py ----- Django項目裏面的工具,通過它可以調用django shell和數據庫等。
- settings.py ---- 包含了項目的默認設置,包括數據庫信息,調試標誌以及其他一些工作的變量。
- urls.py ----- 負責把URL模式映射到應用程序。
- wsgi.py----類似於nginx的功能模塊
- models.py----配置和數據庫有關的操作
- views.py----視圖模塊;所有的視圖函數
from django.contrib import admin from django.urls import path #應用blog下的views文件 from blog import views urlpatterns = [ url(r‘^admin/‘, admin.site.urls), #對應關系;調用views裏的index函數【首頁】【http://127.0.0.1:8800/blog/】 url(r‘^blog/‘, views.index), ]
2】在視圖文件views.py裏編寫和urls.py裏對應的首頁信息;
from django.shortcuts import render,HttpResponse # Create your views here. #必須加參數;一般都用request【是請求信息對象】;HttpResponse【是響應信息對象】 def index(request): #返回一個字符串 #return HttpResponse("<h1>welcome python zhangyu</h1>") #返回頁面;第一次參數是request;第二個參數是在templates目錄下的文件;不需要導入;直接寫就可以 return render(request,"index.html")
2.5、在pycharm啟動django E:\Python\Python自動化開發\day15\Django\Mysite>python manage.py runserver 8800
2.6、訪問http://127.0.0.1:8800/ http://127.0.0.1:8800/blog/ ####################################################################### ######################_______________分割線_______________####################### #######################################################################
Django需要掌握四部分
一、URL控制 二、views【視圖函數】 三、Template【存放.html文件】 四、Models【數據庫操作】 urls===>views===>templates===>mdoels ######################_______________分割線_______________#######################一、URL控制
1.1【url和視圖函數的映射表】 URL配置(URLconf)就像Django 所支撐網站的目錄。它的本質是URL與要為該URL調用的視圖函數之間的映射表。你就是以這種方式告訴Django,對於這個URL調用這段代碼,對於那個URL調用那段代碼""" urlpatterns = [ url(正則表達式, views視圖函數,參數,別名), ] 參數說明: 一個正則表達式字符串 一個可調用對象,通常為一個視圖函數或一個指定視圖函數路徑的字符串 可選的要傳遞給視圖函數的默認參數(字典形式) 一個可選的name參數 """
urlpatterns = [ url(r‘^admin/‘, admin.site.urls), #對應關系;調用views裏的index函數【首頁】【http://127.0.0.1:8800/blog/】 url(r‘^blog/‘, views.index), url(r‘^articles/2003/$‘, views.special_case_2003), #有括號的話就是單一個參數;要在視圖views.year_archive裏加參數 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), ] 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‘)。View Code
1.2【有名分組(named group)】 上面的示例使用簡單的、沒有命名的正則表達式組(通過圓括號)來捕獲URL 中的值並以位置 參數傳遞給視圖。在更高級的用法中,可以使用命名的正則表達式組來捕獲URL 中的值並以關鍵字 參數傳遞給視圖。 在Python 正則表達式中,命名正則表達式組的語法是(?P<name>pattern),其中name 是組的名稱,pattern 是要匹配的模式。
關鍵字參數也對應 #有括號的話就是單一個參數;要在視圖views.year_archive裏加參數 url(r‘^articles/(?P<year>[0-9]{4})/$‘, views.year_archive), url(r‘^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$‘, views.month_archive), url(r‘^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/([0-9]+)/$‘, views.article_detail), 在視圖參數裏;即使參數位置變化也能取到值 def article_detail(request,year,month,id):View Code
1.3 【URLconf 在什麽上查找】 URLconf 在請求的URL 上查找,將它當做一個普通的Python 字符串。不包括GET和POST參數以及域名。 例如,http://www.example.com/myapp/ 請求中,URLconf 將查找myapp/。 在http://www.example.com/myapp/?page=3 請求中,URLconf 仍將查找myapp/。 URLconf 不檢查請求的方法。換句話講,所有的請求方法 —— 同一個URL的POST、GET、HEAD等等 —— 都將路由到相同的函數。 1.4 【捕獲的參數永遠是字符串】 每個捕獲的參數都作為一個普通的Python 字符串傳遞給視圖,無論正則表達式使用的是什麽匹配方式。例如,下面這行URLconf 中: url(r‘^articles/(?P<year>[0-9]{4})/$‘, views.year_archive), views.year_archive() 的year 參數將是一個字符串 1.5【URL分發】【在自己的項目獨立建urls文件】 分出去的URL;訪問時;要加項目名http://127.0.0.1:8800/blog/articles/2003/ Django接收post請求時會報錯;需要註釋settings.py文件裏的這行 ‘django.middleware.csrf.CsrfViewMiddleware‘,
1.6【別名name=‘INDEX‘】 設置好別名後;URL怎麽改都不會對項目有影響 urls.py文件
urlpatterns = [ url(r‘^admin/‘, admin.site.urls), url(r‘^login/‘, views.login,name="LOGIN"), ]
login.html文件
<h1>登錄頁面</h1> {# <form action="/index/" method="post">#} <form action="{% url ‘LOGIN‘ %}" method="post"> 用戶名:<p><input type="text" name="username"></p> 密碼:<p><input type="password" name="pwd"></p> <input type="submit" value="submit"> </form> </body>
######################_______________分割線_______________#######################
二、views【視圖函數】
一個視圖函數,或者簡短來說叫做視圖,是一個簡單的Python函數,它接受web請求,並且返回web響應。響應可以是一張網頁的HTML內容,一個重定向,一個404錯誤,一個XML文檔,或者一張圖片. . . 是任何東西都可以。無論視圖本身包含什麽邏輯,都要返回響應。代碼寫在哪裏也無所謂,只要它在你的Python目錄下面。除此之外沒有更多的要求了——可以說“沒有什麽神奇的地方”。為了能夠把代碼放在某個地方,慣例是把視圖放在叫做views.py的文件中,然後把它放到你的項目或者應用目錄裏。 請求對象:request【每個視圖函數裏一定有request參數;封裝所有數據對象】 響應對象:HttpResponse【每次return的值一定是HttpResponse的對象】 2.1、訪問url返回時間實例 urls文件from django.conf.urls import url,include from django.contrib import admin #應用blog下的views文件 from blog import views urlpatterns = [ url(r‘^timer/‘,views.timer), ]
views文件
import datetime def timer(req): #當前時間 t=datetime.datetime.now() #返回當前時間 return HttpResponse("<h1>Current time:%s</h1>" %t)讓我們逐行閱讀上面的代碼:
- 首先,我們從 django.http模塊導入了HttpResponse類,以及Python的datetime庫。
- 接著,我們定義了timer函數。它是一個視圖函數。每個視圖函數都應接收HttpRequest對象作為第一個參數,一般叫做request。
- 註意視圖函數的名稱並不重要;不需要用一個統一的命名方式來命名,以便讓Django識別它。我們將其命名為timer,是因為這個名稱能夠精確地反映出它的功能。
- 這個視圖會返回一個HttpResponse對象,其中包含生成的響應。每個視圖函數都要返回HttpResponse對象
‘‘‘ 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支持時該屬性才可用。 ‘‘‘View Code 2.2、render函數 如何把後端的變量嵌套進入前端頁面 在html頁面用{{}}標記;裏面填寫render裏{}的值 大致流程 1、render找到html文件;並設置變量{} 2、在html文件裏{{}}填寫實戰的變量 3、渲染完後返回給return render方法有兩個功能;1、返回一個也沒;2、模版語法:將變量嵌入到html頁面中 views文件
import datetime def timer(req): #當前時間 t=datetime.datetime.now() #返回當前時間 #return HttpResponse("<h1>Current time:%s</h1>" %t) #返回結果使用render渲染; """ 1、render會找到timer.html模版文件; 2、在timer.html文件裏找到{{}}在裏面寫Time; 如:<h1>Current time: {{ Time }}</h1> """ return render(req,"timer.html",{"Time":t})View Code html文件
<body> {# 把後端的變量嵌套進入前端頁面#} <h1>Current time: {{ Time }}</h1> </body>
render函數
- ---------------render(request, template_name[, context])
- 結合一個給定的模板和一個給定的上下文字典,並返回一個渲染後的 HttpResponse 對象。
- 參數:
- request: 用於生成響應的請求對象。
- template_name:要使用的模板的完整名稱,可選的參數
- context:添加到模板上下文的一個字典。默認是一個空字典。如果字典中的某個值是可調用的,視圖將在渲染模板之前調用它。
- content_type:生成的文檔要使用的MIME類型。默認為DEFAULT_CONTENT_TYPE 設置的值。
- status:響應的狀態碼。默認為200。
urlpatterns = [ url(r‘^login/‘, views.login,name="LOGIN"), url(r‘^back‘,views.back), ]
views文件【這裏需要註意locals】
def login(req): if req.method==‘POST‘: username=req.POST.get(‘username‘,None) password=req.POST.get(‘pwd‘,None) if username==‘alex‘ and password==‘123‘: #return HttpResponse("登陸成功") #如果登錄成功轉到back的URL return redirect("/back") return render(req,‘login.html‘) def back(req): name="alex" #locals表示當前函數內的所有變量;在back文件裏直接寫{{name}}就可以 return render(req,"back.html",locals())View Code
login.html文件
<body> <h1>登錄頁面</h1> {# <form action="/index/" method="post">#} <form action="{% url ‘LOGIN‘ %}" method="post"> 用戶名:<p><input type="text" name="username"></p> 密碼:<p><input type="password" name="pwd"></p> <input type="submit" value="submit"> </form> </body>
back.html文件
<body> <h1>hello {{ name }}</h1> </body>
思路:
- 編寫urls文件:http://127.0.0.1:8800/login和http://127.0.0.1:8800/back
- 編寫views視圖文件:編寫登錄函數login(req);登錄驗證;和登錄成功跳轉url【return redirect("/back")】
- 編寫views視圖文件:編寫用戶界面函數back(req);直接返回用戶界面頁面back.html;locals表示當前函數內的所有變量;在back文件裏直接寫{{name}}就可以
三、Template【存放.html文件】
這部分我都是看老師或者同學的博客;第一天學;這塊有點模糊; ######################_______________分割線_______________#######################四、Models【數據庫操作】
4.1 ORM表模型【models文件】from django.db import models # Create your models here. #ORM:對象關系映射【python的類-----數據表 # python的類實例-----表的記錄 # python的類屬性-----表的字段 #創建Books表 class Books(models.Model): #主鍵 #nid=models.IntegerField(primary_key=True) #標題-字符串-32字節 title=models.CharField(max_length=32) #作者 author=models.CharField(max_length=32) #價格 price=models.FloatField() #出版時間 pub_date=models.DateField()View Code
E:\Python\Python自動化開發\day15\Django\Mysite>python manage.py makemigrations
Migrations for ‘blog‘: blog\migrations\0001_initial.py - Create model Books E:\Python\Python自動化開發\day15\Django\Mysite>python manage.py migrate
Operations to perform: Apply all migrations: admin, auth, blog, contenttypes, sessions 註釋【 在你改動了 model.py的內容之後執行下面的命令: python manger.py makemigrations 相當於 在該app下建立 migrations目錄,並記錄下你所有的關於modes.py的改動,比如0001_initial.py, 但是這個改動還沒有作用到數據庫文件 你可以手動打開這個文件,看看裏面是什麽 在此之後執行命令 python manager.py migrate 將該改動作用到數據庫文件,比如產生table之類 】 4.2 ORM之增(create,save)、刪(delete)、改(update和save)、查(filter,value)、 在urls.py裏添加url【這個是總的】
from django.conf.urls import url,include from django.contrib import admin #應用blog下的views文件 from blog import views urlpatterns = [ url(r‘^admin/‘, admin.site.urls), url(r‘^login/‘, views.login,name="LOGIN"), #對應關系;調用views裏的index函數【首頁】【http://127.0.0.1:8800/blog/】 url(r‘^blog/‘, include(‘blog.urls‘)), url(r‘^timer/‘,views.timer), url(r‘^back‘,views.back),#查看在這裏做的 url(r‘^add_books‘,views.add_books),#增加 url(r‘^delete_books‘,views.delete_books),#刪除 url(r‘^edit_books‘,views.edit_books),#修改 ]View Code
views.py文件
from django.shortcuts import render,HttpResponse,redirect # Create your views here. #必須加參數;一般都用request【是請求信息對象】;HttpResponse【是響應信息對象】 def index(request): #返回一個字符串 #return HttpResponse("<h1>welcome python zhangyu</h1>") #返回頁面;第一次參數是request;第二個參數是在templates目錄下的文件;不需要導入;直接寫就可以 return render(request,"index.html") def login(req): if req.method==‘POST‘: username=req.POST.get(‘username‘,None) password=req.POST.get(‘pwd‘,None) if username==‘alex‘ and password==‘123‘: #return HttpResponse("登陸成功") #如果登錄成功轉到back的URL return redirect("/back") return render(req,‘login.html‘) #引用models模塊 from blog.models import * #ORM-查看數據 def back(req): #這裏要註意在html文件裏怎麽去obg_list的值 obg_list=Books.objects.all() #locals表示當前函數內的所有變量;在back文件裏直接寫{{name}}就可以 return render(req,"back.html",locals()) #ORM-增加數據 def add_books(request): #創建記錄的兩種方式:1/create 2/save #註意:pub_date是Datetime數據類型;格式固定【2018-05-10】 #Books.objects.create(title="python",author="egon",price=89,pub_date="2018-05-10") b=Books(title="JAVA",author="zhangyu",price=11,pub_date="2111-11-11") #調用save;保存到數據庫 b.save() #return HttpResponse("添加成功!!!") return redirect("/back/") #ORM-刪除數據 def delete_books(req): #取/delete_books?id=3裏面的id id=req.GET.get("id") #filter帥選過濾;然後刪除 Books.objects.filter(id=id).delete() return redirect("/back/") #ORM-編輯數據 def edit_books(req): id = req.GET.get("id") #filter和get都是篩選條件;filter取到的是集合對象;get是單一對象 # b=Books.objects.get(id=id) # b.price=100 # b.save()#效率低 Books.objects.filter(id=id).update(price=100) return redirect("/back/")View Code
back.html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>hello {{ name }}</h1> <h1>書籍管理工具</h1> {#註意這裏的變量;深度變量的查找(萬能的句點號)#} {% for obj in obg_list %} <p>書名{{ obj.title }} 作者{{ obj.author }} 日期{{ obj.pub_date }} 價格{{ obj.price }} <a href="/delete_books/?{{ obj.id }}">刪除</a> <a href="/edit_books/?id=5">編輯</a></p> {% endfor %} <a href="/add_books/">添加</a> </body> </html>View Code
下面是練習的截圖
Python Web框架【Django框架第一篇基礎】