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

Django框架第一篇基礎【DjangoMTV模式】

 
 
老師博客【www.cnblogs.com/yuanchenqi/articles/6811632.html】
同窗博客:http://www.cnblogs.com/haiyan123/p/7701412.html
Django官網:https://www.djangoproject.com/download/
 
 

1、安裝Django

DjangoMTV模式
Django的MTV模式本質是各組件之間爲了保持鬆耦合關係,Django的MTV分別表明:
      Model(模型):負責業務對象與數據庫的對象(ORM)
      Template(模版):負責如何把頁面展現給用戶
      View(視圖):負責業務邏輯,並在適當的時候調用Model和Template
      此外,Django還有一個url分發器,它的做用是將一個個URL的頁面請求分發給不一樣的view處理,view再調用相應的Model和Template
 
 
windows7
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.二、將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

 

2、Django基本命令

2.一、使用命令建立一個Django項目
E:\Django_project> django-admin startproject mysite
當前目錄下會生成mysite的工程,目錄結構以下:
  • manage.py ----- Django項目裏面的工具,經過它能夠調用django shell和數據庫等。
  • settings.py ---- 包含了項目的默認設置,包括數據庫信息,調試標誌以及其餘一些工做的變量。
  • urls.py ----- 負責把URL模式映射到應用程序。
  • wsgi.py----相似於nginx的功能模塊
 
2.二、在mysite目錄下建立應用,好比blog:
E:\Django_project\mysite> python manage.py startapp blog
  • models.py----配置和數據庫有關的操做
  • views.py----視圖模塊;全部的視圖函數
 
 
2.三、使用pycharm建立django項目
 
2.四、配置文件
    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.五、在pycharm啓動django
E:\Python\Python自動化開發\day15\Django\Mysite> python manage.py runserver 8800
 
2.六、訪問http://127.0.0.1:8800/
http://127.0.0.1:8800/blog/
 
 
 

Django須要掌握四部分

1、URL控制
2、views【視圖函數】
3、Template【存放.html文件】
4、Models【數據庫操做】
 
urls===>views===>templates===>mdoels
 
 
 

1、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>

 

2、views【視圖函數】

一個視圖函數,或者簡短來講叫作視圖,是一個簡單的Python函數,它接受web請求,而且返回web響應。響應能夠是一張網頁的HTML內容,一個重定向,一個404錯誤,一個XML文檔,或者一張圖片. . . 是任何東西均可以。不管視圖自己包含什麼邏輯,都要返回響應。代碼寫在哪裏也無所謂,只要它在你的Python目錄下面。除此以外沒有更多的要求了——能夠說「沒有什麼神奇的地方」。爲了可以把代碼放在某個地方,慣例是把視圖放在叫作views.py的文件中,而後把它放到你的項目或者應用目錄裏。
 
請求對象:request【每一個視圖函數裏必定有request參數;封裝全部數據對象】
響應對象:HttpResponse【每次return的值必定是HttpResponse的對象】
 
2.一、訪問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.二、render函數
如何把後端的變量嵌套進入前端頁面
在html頁面用{{}}標記;裏面填寫render裏{}的值
大體流程
    一、render找到html文件;並設置變量{}
    二、在html文件裏{{}}填寫實戰的變量
    三、渲染完後返回給return
render方法有兩個功能;一、返回一個也沒;二、模版語法:將變量嵌入到html頁面中
 
views文件
import datetime
def timer(req):
    #當前時間
    t=datetime.datetime.now()
    #返回當前時間
    #return HttpResponse("<h1>Current time:%s</h1>" %t)
    #返回結果使用render渲染;
    """
    一、render會找到timer.html模版文件;
    二、在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.三、重定向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}}就能夠
 
 

3、Template【存放.html文件】

 
 這部分我都是看老師或者同窗的博客;第一天學;這塊有點模糊;
 
 
 
 

4、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

 

下面是練習的截圖
 
 
相關文章
相關標籤/搜索