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/
 
 

一、安裝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

 

下面是練習的截圖
 
 
 
 
 
 
 
 
 
 
 
 


免責聲明!

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



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