1. 程式人生 > >Python Web框架【Django框架第一篇基礎】

Python Web框架【Django框架第一篇基礎】

界面 博客 make ted 分割 增加 welcom 關系 可選

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(模版):負責如何把頁面展示給用戶
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
驗證是否安裝成功
#!/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的功能模塊
2.2、在mysite目錄下創建應用,比如blog: E:\Django_project\mysite>python manage.py startapp blog
技術分享圖片 技術分享圖片
  • models.py----配置和數據庫有關的操作
  • views.py----視圖模塊;所有的視圖函數
2.3、使用pycharm創建django項目 技術分享圖片 技術分享圖片 2.4、配置文件 1】在urls.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對象
‘‘‘ http請求-響應過程中有兩個核心對象: http請求對象:HttpRequest http響應響應:HttpResponse 所在位置:django.http ‘‘‘ 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支持時該屬性才可用。
 
‘‘‘
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。
2.3、重定向redirect函數 需要引用redirect模塊 以登錄網頁為例子 urls文件
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>

思路:
  1. 編寫urls文件:http://127.0.0.1:8800/login和http://127.0.0.1:8800/back
  2. 編寫views視圖文件:編寫登錄函數login(req);登錄驗證;和登錄成功跳轉url【return redirect("/back")】
  3. 編寫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框架第一篇基礎】