淺談Web框架
一,什么是框架?
軟件框架就是為實現或完成某種軟件開發時,提供了一些基礎的軟件產品,
框架的功能類似于基礎設施,提供并實現最為基礎的軟件架構和體系
通常情況下我們依據框架來實現更為復雜的業務程序開發
一個字,框架就是程序的骨架
二,框架的優缺點
可重用
成熟,穩健
可擴展性良好
選對框架很重要
三,python中常見的框架
大包大攬 Django
被官方稱之為完美主義者的Web框架。
力求精簡 web.py
和Tornado
新生代微框架 Flask
和Bottle
MVC設計模式
MVC實現了前后端和數據的分離,程序的解耦合,實現了程序的可擴展性,可維護性
英文 | 中文 | 針對部分 | 作用 |
---|---|---|---|
Model | 模型 | 是針對數據庫層面的 | 程序調用模型,直接操作繼承model的模型對象 |
View | 視圖 | 是針對用戶界面的數據顯示 | 模板(hmtl) |
Controller | 控制器 | 針對業務邏輯的操作 | python程序 |
MVT
M | Model | 模型 | 數據層 |
V | View | 視圖 | 業務邏輯 |
T | Template | 模板 | html |
起步
1. 認識Django
Django是一個高級的Python Web框架,它鼓勵快速開發和清潔,務實的設計。
由經驗豐富的開發人員構建,它負責Web開發的許多麻煩,因此您可以專注于編寫應用程序,而無需重新創建輪子。
它是免費的和開源的。
被官方稱之為完美主義者的Web框架。
Django可以更快地構建更好的Web應用程序并減少代碼。
官方網址:https://www.djangoproject.com/
中文文檔:http://python.usyiyi.cn/
2. Django框架的特點:
快速開發:Django的宗旨在于幫助開發人員快速從概念到完成應用程序。
安全可靠:Django認真對待安全性,幫助開發人員避免許多常見的安全錯誤。
超可伸縮性: Web上的一些最繁忙的網站利用了Django快速靈活擴展的能力。
3. Django可以使用什么Python版本?
Django版本 | Python版本 |
---|---|
1.8 | 2.7,3.2(直到2016年底),3.3, 3.4, 3.5 |
1.9, 1.10 | 2.7, 3.4, 3.5 |
1.11 | 2.7 , 3.4 , 3.5 , 3.6 |
2.0 | 3.5+ |
4. Django的開發版本
LTS : 長期穩定版
- 2015 April 1.8
- 2017 April 1.11
- 2019 April 2.2
5. Django安裝
作為Python Web框架,Django需要Python,在安裝Python同時需要安裝pip。
# 在線安裝Django
pip3 install Django
# 檢測當前是否安裝Django及版本
python3 -m django --version
1.11.7
這里可以使用 -i 參數來指定鏡像源位置
6. 使用Django框架搭建項目
# 在一個目錄中執行一下命令,就會創建一個web項目目錄
django-admin startproject web# 進入到web文件夾中,執行以下命令,啟動項目
python3 manage.py runserver# 接下來就可以在瀏覽器中訪問了
Django入門
創建一個應用
python3 manage.py startapp home# 以上命令會在項目文件夾中創建一個目錄home
請求的流程
用戶輸入url地址發起請求,服務器接受到請求后,交給跟路由(項目同名目錄下的urls.py)
使用模板文件
URLconf路由
路由的定義
URL ==> 統一資源定位符
指得就是請求的(URL)地址
http://python.itxdl.cn/html/tutorial/
http://python.itxdl.cn/html/teachers/
可以在項目中指定請求的url地址,來交給對應的試圖函數進行解析
路由的特點
路由就是在urls中進行規則的配置
按照從上往下的順序來執行
如果匹配到,則假裝指定的視圖函數來執行
如果匹配不到,則拋出404 page not found
路由參數
路由參數就是在定義規則時,使用小括號
()
括起來的內容,將作為參數傳遞給視圖函數
# 路由規則
url(r'^article/(\d)$', views.article),
# 視圖函數
def article(request,para):return HttpResponse('接受到的參數是:'+para)
命名組,命名參數
和路由參數一樣是用來獲取url中路徑作為參數來使用
不同的是,命名組會把當前參數作為,關鍵字參數傳遞給視圖函數,
因此對應的視圖函數,必須有關鍵字參數
# 命名組 使用?P<變量名>方式來定義
url(r'abc/(?P<aa>[0-9]+/$',view.abc_2003)# 在對應的視圖函數中則必須有對應的關鍵字
def abc_2003(request,aa):print(aa)return HttpResponse('abc_2003')
指定用于視圖參數的默認值
兩個路由指向同一個視圖函數
# 路由
url(r'^user/index/(?P<page>[0-9]+)/$', views.user_index),
url(r'^user/index/$', views.user_index),# 視圖函數
def user_index(request,page=1):print(page)return HttpResponse('用戶列表數據的顯示'+page)
Model模型
數據庫配置
- 安裝mysql
- 創建庫,指定字符集
- 安裝pymysql
- 在settings.py的同級目錄中找到__init__.py文件,聲明pymysql
- 在settings.py文件中配置 數據庫
- 在settings.py文件中添加當前的應用
定義模型
在模型中定義屬性,會生成表中的字段
django會為表增加自動增長的主鍵列,每個模型只能有一個主鍵列
如果使用選項設置某屬性為主鍵列后,則django不會再生成默認的主鍵列
屬性命名限制
不能是python的保留關鍵字
由于django的查詢方式,不允許使用連續的下劃線
定義步驟
- 找到應用中的models.py文件
from django.db import models# Create your models here.
# 模型的作用,降低程序的耦合性,更換數據庫就改個配置文件就行了class Users(models.Model):username = models.CharField(max_length=32)password = models.CharField(max_length=32)email = models.CharField(max_length=50)
- 生成遷移文件
python3 manage.py makemigrations
- 執行遷移
python3 manage.py makemigrate
View視圖
Django中的視圖
Django具有“視圖”的概念來封裝負責處理用戶請求和返回響應的邏輯
視圖函數或視圖簡而言之就是一個Python函數,它接受一個Web請求并返回一個Web響應
此響應可以是網頁的HTML內容,重定向或404錯誤,XML文檔或圖像。
為了將代碼放在某處,慣例是將視圖views.py放在名為的文件中,放在項目或應用程序目錄中
在視圖函數中使用模型
- 先在視圖函數中導入models
from . import models
# 模型的操作演示
def mod_demo(request):# 使用模型進行操作數據庫 數據的查詢操作res = models.Users.objects.all()print(res)# < QuerySet[ < Users: Users object >] ># 一個查詢集for x in res:print(x.username)return HttpResponse('模型你給的操作演示')
url 統一資源定位符
http://127.0.0.1:8000/user/abc?a=1&b=2
協議:http https file svn
ip或域名 127.0.0.1 www.itxdl.cn
端口: 80 443 8000 5000 8080
路徑: /user/abc
參數: ?a=1&b=2
模型的操作
# 1查詢
# 獲取當前模型中所有的對象數據
# 結果為一個查詢集
obs = models.Stu.objects.all()
# 根據id獲取當前對象 結果 對象
ob = models.Stu.objects.get(id=1)
# 注意:get方法能且只能返回一個對象
# 查多個報錯,查不到也報錯# 2添加
# 第一中方法
data = {'name':'admin','age',20}
ob = models.Stu(**data)
ob.save()
# 第二種方法
ob = models.Stu()
ob.name = 'zhangsan'
ob.age = 20
ob.save()# 推薦第一種
# 3刪除
# 獲取對象.執行刪除
ob.delete())# 4更新
ob.name = 'aabb'
ob.save())
增刪改查
用戶管理
先定義一個視圖函數 顯示添加表單
表單吧數據提交到 執行數據添加的函數中
完成后跳轉到 用戶列表的視圖函數中
刪除鏈接提交到 一個執行用戶刪除的視圖函數中k,完成后跳轉列表頁面
編輯鏈接提交到 一個顯示用戶數據的修改表單中
修改表單吧數據 提交到執行數據更新的視圖函數中
這6個步驟對應6個路由
# 用戶數據的管理
url(r'stu/index$',views.stu_index,name='stu_index'),
# 執行用戶的添加
url(r'stu/insert$',views.stu_insert,name='stu_insert'),
# 顯示添加的表單
url(r'stu/add$',views.stu_add,name='stu_add'),
# 執行用戶的刪除
url(r'stu/del$',views.stu_del,name='stu_del'),
# 用戶的編輯表單
url(r'stu/edit$',views.stu_edit,name='stu_edit'),
# 執行用戶數據的更新
url(r'stu/update$',views.stu_update,name='stu_update'),
生成遷移文件時,還沒有吧應用添加到配置文件中?
如果已經生成遷移文件,則直接執行遷移就可以,
另外注意,生成的遷移文件不要輕易刪除
模型定義
class User(models.Model):pass
在這里已經說了
模型更改問題
如果模型已經創建好了一個表,你再模型中在增加一個字段,在生成遷移文件的時候就會報出
新增的一個字段時注意,如果當前新增的字段不允許為空,并且沒有設置默認值,
則會在生成遷移時
You are trying to add a non-nullable field 'age' to users without a default; we c
an't do that (the database needs something to populate existing rows).
Please select a fix:1) Provide a one-off default now (will be set on all existing rows with a null v
alue for this column)2) Quit, and let me add a default in models.py
翻譯過來是:
就是說,你加了一個字段,還說不能為空,然后那我之前還有挺多數據呢,這可咋整啊
您還想添加一個非空字段,還沒有默認,是不是傻?選擇一個修復吧,趕緊的:1)提供一個一次性的值2)退出,修改當前新增字段1. 設置默認值2. 允許為空
就算你表中沒有數據,他也會這樣問,以為他傻,他不知道你有沒有數據,他也不能知道,也不需要知道
Django學習中遇到的問題(1)django migration No migrations to apply
Template模板
模板概念
作為Web 框架,Django 需要一種很便利的方法以動態地生成HTML。最常見的做法是使用模板。
模板包含所需HTML 輸出的靜態部分,以及一些特殊的語法,描述如何將動態內容插入。
模板語法
1.變量
-
變量輸出語法
{{ var }}
-
當模版引擎遇到一個變量,將計算這個變量,然后將結果輸出
-
變量名必須由字母、數字、下劃線(不能以下劃線開頭)和點組成
-
當模版引擎遇到點("."),會按照下列順序查詢:
- 字典查詢,例如:foo[“bar”]
- 屬性或方法查詢,例如:foo.bar
- 數字索引查詢,例如:foo[bar]
-
如果變量不存在, 模版系統將插入’’ (空字符串)
-
在模板中調用方法時不能傳遞參數
2.標簽
- 語法
{ % tag % }
- 作用
- 在輸出中創建文本
- 控制循環或邏輯
- 加載外部信息到模板中
for標簽
{ % for ... in ... % }循環邏輯
{ % endfor % }
if標簽
{ % if ... % }邏輯1
{ % elif ... % }邏輯2
{ % else % }邏輯3
{ % endif % }
comment標簽
{ % comment % }多行注釋
{ % endcomment % }
include:加載模板并以標簽內的參數渲染
{ % include "base/index.html" % }
url:反向解析
{ % url 'name' p1 p2 % }
csrf_token:這個標簽用于跨站請求偽造保護
{ % csrf_token % }
Django框架自帶的后臺
-
在瀏覽器訪問 admin
http://127.0.0.1:8000/admin/
-
需要登錄,因此要創建一個超級用戶
在命令行執行下一個命令進行創建
python3 manage.py createsuperuser
-
重新啟動服務后 ,使用創建的用戶進行后臺的登錄
-
配置settings.py文件,配置語言和時區
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False