程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Django 學習

編輯:Python

點擊Django跳到閱讀點

文章目錄

  • Django
    • windows安裝
  • 設計模式與模板層
    • MVC
    • MTV
      • M模型層
        • 應用
          • 分布式路由
          • 模板
        • **模型
        • **ORM框架
        • **模型創建
        • Meta類
        • **模型使用
      • T模板層
        • 模板配置
        • 加載模板
        • 模板變量
        • 模板標簽
        • 過濾器
        • 繼承
        • 靜態文件
  • ORM模型CRUD
    • 數據庫設置
    • 字段類型
    • 字段選項
    • 關系映射
    • 創建數據
      • Django Shell
    • 查詢操作
    • 更新操作
    • 刪除操作
    • F&Q
    • 聚合查詢
    • 原生數據庫
  • 數據庫使用
    • 數據庫設置
    • 字段類型
    • 字段選項
    • 關系映射
  • 入門使用
    • 創建項目
    • pycharm配置
    • 運行項目
    • 創建應用(startapp)
    • 創建view
    • 創建模型(數據庫表)
    • 激活模型
  • Cookie&Session
  • Admin後台
  • 函數
    • path()
    • render()
    • HttpResponseRedirect
  • 功能
    • URL
    • url反向解析
    • url跳轉&頁面跳轉&傳參
    • 請求傳參的四種方式
    • Django中的請求
    • Django響應
    • 請求響應
    • setting文件
    • 路由配置
  • 基礎
    • Django中的請求
    • Django響應
    • http請求
    • HTTP響應
  • 項目開發
    • http請求
    • HTTP響應
  • 項目開發

Django

下載網站

https://www.python.org/downloads/windows/

Django 是在快節奏的新聞編輯室環境中開發的,所以它旨在使常見的 Web 開發任務變得快速而簡單

windows安裝

  • 在 Windows 上安裝 Python 3.8 和 Django3.2.10

  • 解壓Django到文件夾,在進到解壓目錄,在cmd中運行python setup.py install

  • 等運行完,cmd測試是否成功

  • >python
    Python 3.8.7
    >>> import django
    >>> django.get_version()
    '3.2.10'
    >>>
    

設計模式與模板層

MVC

MVC代表Model-View-Controller (模型-視圖-控制器)模式。

  • M 模型層(Model),主要用於對數據庫層的封裝
  • V 視圖層(View),用於向用戶展示結果 (WHAT + HOW )
  • C 控制(Controller ,用於處理請求、獲取數據、返回結果(重要)

MTV

核心邏輯代碼跳到V中

MTV代表Model-Template-View(模型-模板-視圖)模式。

  • M 模型層(Model)負責與數據庫交互
  • T 模板層(Template)負責呈現內容到浏覽器(HOW)
  • V 視圖層(View)是核心,負責接收請求、獲取數據、返回結果(WHAT)

M模型層

應用

應用在Django項目中是一個獨立的業務模塊,

可以包含自己的路由,視圖,模板,模型

  • 創建應用文件夾
    • python manage.py startapp name
  • 安裝此應用
    • settings.py配置INSTALLED_APPS = [name , … , …]
├─name ''' 小MTV結構 '''
│ │ admin.py #管理
│ │ apps.py
│ │ models.py #數據庫相關
│ │ tests.py
│ │ views.py #視圖邏輯
│ │ __init__.py
│ │
│ └─migrations #數據庫
│ __init__.py
分布式路由

Django中,

主路由配置文件(urls.py)可以不處理用戶具體路由

主路由配置文件的可以做請求的分發(分布式請求處理)。

具體的請求可以由各自的應用來進行處理

創建應用內的URLS
1 主路由中調用include函數,用於
將當前路由轉到各個應用的路由配置文件的urlpatterns進行分布式處理
include('app名字.url模塊名')
例如:
path('music/',include(music.urls)),
2 setting中添加應用(就是添加目錄)
例如:
INSTALLED_APPS = [
'django.contrib.staticfiles',
'music',] #否則目錄下的模板可能找不到 
3 配置應用內urls.py
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index',views.index_view)
]
模板

應用內部可以配置模板目錄

  • 應用下手動創建templates文件夾
  • settings.py中開啟應用模板功能
    • TEMPLATE 配置項中的'APP_DIRS'值為True 即可
  • 應用下templates和外層templates都存在時,django得查找模板規則
    • 1.優先查找外層templates目錄下的模板
    • 2.按INSTALLED_APPS配置下的應用順序逐層查找
TEMPLATES = [
{
 'APP_DIRS': True, }]

**模型

模型層,與數據庫交互

什麼是模型?

模型是一個Python類,它是由django.db.models.Model派生出的子類。

  • 一個模型類代表數據庫中的一張數據表
  • 模型類中每一個類屬性都代表數據庫中的一個字段
  • 模型是數據交互的接口,是表示和操作數據庫的方法和方式

**ORM框架

ORM (Object Relational Mapping)即對象關系映射,

它是―種程序技術,

它允許你使用類和對象對數據庫進行操作,從而避免通過SQL語句操作數據庫

  • 建立模型類和表之間的對應關系,允許通過面向對象的方式來操作數據庫
  • 根據設計的模型類生成數據庫中的表格。
  • 通過簡單的配置就可以進行數據庫的切換
優點:
只需要面向對象編程,不需要面向數據庫編寫代碼.
對數據庫的操作都轉化成對類屬性和方法的操作.
不用編寫各種數據庫的sql語句.
實現了數據模型與數據庫的解耦,屏蔽了不同數據庫操作上的差異.
不在關注用的是mysql、oracle...等數據庫的內部細節.
簡單的配置就可以輕松更換數據庫.而不需要修改代碼
缺點:
對於復雜業務,使用成本較高
根據對象的操作轉換成SQL語句,根據查詢的結果轉化成對象,在映射過程中有性能損失.

映射關系

ORMDB類數據表對象數據行屬性字段

**模型創建

class模型類名(mode1s.Mode1) :
字段名= models.字段類型(字段選項)
1.創建app
python manage.py startapp bookstore
2.寫模型models.py
'''from django.db import models class Book(models.Model): title = models.charFie1d("書名",max_length=50,default=' ') price = models.DecimalFie1d('定價',max_digits=7,decimal_places=2,defau1t=0.0) '''
3.數據庫遷移
Django同步對模型所做更改(添加字段,刪除模型等)到數據庫模式的方式
(1)生成遷移文件-執行
# python manage.py makemigrations
將應用下的models.py文件生成一個中間文件,並保存在migrations文件夾中
(2)執行遷移腳本程序-執行
# python manage.py migrate
執行遷移程序實現遷移。將每個應用下的migrations目錄中的中間文件同步回數據庫
#會生成很多表

Meta類

使用內部 Meta類來給模型賦予屬性

Meta類下有很多內建的類性,可對模型類做一些控制

class Book(models.Model):
...
...
class Meta:
db_table='name?'
...

**模型使用

修改表結構在models.py中修改

任何關於表結構的修改,務必在對應模型類上修改

修改後

python manage.py makemigrations
python manage.py migrate

T模板層

- 1.模板是可以根據字典數據動態變化的html網頁
- 2.模板可以根據視圖中傳遞的字典數據動態生成相應的HTML網頁。

模板配置

1.創建模板文件夾<項目名>/templates

2.在settings.py 中 TEMPLATES配置項

如果編譯器找不到模板

  • - BACKEND:指定模板的引擎
    - 接受視圖,調用視圖的實現,默認系統自帶
    - DIRS:模板的搜索目錄
    - 添加上自己創建的模板目錄(可以是一個或多個)
    - APP_DIRS∶是否要在應用中的templates 文件夾中搜索模板文件
    - OPTIONS∶有關模板的選項
    配置項中需要修改部分
    設置DIRS
    - 'DIRS'": [os.path.join(BASE_DIR, 'templates')],
    

加載模板

#template_view
from django.template import loader
#1.通過1oader加載模板‘
t = loader. get_template("模板文件名") #如test.html
# 2.將t轉換成HTML字符串
html = t.render(字典數據)
# 3.用響應對象將轉換的字符串內容返回給浏覽器
return HttpResponse(htm1)
''' from django.shortcuts import render return render(request,"test.html",dict) #請求,網頁,字典 '''
#templates/test.html
<-- 可以用{
{變量名}}來引用模板傳入的字典值 /-->
<!DOCTYPE html>
<html lang="zh-Hans">
<head> </head>
<body>
<h1> 這是模板 </h1>
</body>
</html>

模板變量

def mode_view(request):
dict={

"fruit":"apple",
"value":'10'
}
return render(request,"test1.html",dict)
傳遞類型
str int list tuple dict func odj
{
{
name}}#(變量名)
{
{
name.index}}
{
{
name.key}}
{
{
name.方法}}
{
{
函數名}}

模板標簽

作用

  • 將一些服務器端的功能嵌入到模板中,例如流程控制等
標簽語法
if標簽
{% if 表達式1 %}
.。。
{% elif 表達式2 %}
。。。
{% else 表達式3 %}
...
{% endif %}
for標簽
{% for name in list %}
{
{name}}
{% endfor %}

過濾器

  • 定義:在變量輸出時對變量的值進行處理
  • 作用:可以通過使用過濾器來改變變量的輸出顯示
  • 語法∶{ { 變量|過濾器1:‘參數值1’|過濾器2:參數值2’…].}}

繼承

模板繼承可以使父模板的內容重用,子模板直接繼承父模板的全部內容並可以覆蓋父模板中相應的塊

#語法–父模板中:
定義父模板中的塊 block標簽標識出哪些在子模塊中是允許被修改的
block標簽:在父模板中定義,可以在子模板中覆蓋
block標簽外的不能改
#語法–子模板中:
繼承模板extends標簽(寫在模板文件的第一行)
例如{
%extends 'base.html'%}
子模板重寫父模板中的內容塊
### block標簽 ###
{
% block block_name %}
子模板塊用來覆蓋父模板中 block_name塊的內容
{
% endblock block_name %}

靜態文件

  • 靜態文件配置 settings.py中
配置靜態文件的訪問路徑【該配置默認存在】
#通過哪個url地址找靜態文件
STATIC_URL = '/static/'
說明:
指定訪問靜態文件時是需要通過/static/xxx
或http://127.0.0.1:8000/static/xxx
[xxx表示具體的靜態資源位置]
#配置靜態文件的存儲路徑STATICFILES DIRS
STATICFILES_DIRS保存的是靜態文件在服務器端的存儲位置
STATICFILES_DIRS = (
os.path.join(BASE_DIR,"static"),
)
模板中訪問靜態文件
- img標簽為例
1.<img src=" /static/image/django2.jpg" width="200px"height="200px">
<img src="http://127.0.0.1:8000/static/image/django2.jpg">
2.通過{%static %}標簽訪問靜態文件
加載static -
#放最上
{% load static %}
使用靜態資源– {% static '靜態資源路徑'%}
樣例
<img src="{% static 'images/lena.jpg'%}">
<body >

ORM模型CRUD

基本操作包括增刪改查操作,即(CRUD操作)
CRUD是指在做計算處理時的增加(Create)、讀取查詢(Read)、更新(Update)和刪除(Delete)
ORM CRUD核心—>模型類.管理器對象(model.object. )

每個繼承自models.Model的模型類,都會有一個objects對象被同樣繼承下來。

這個對象叫管理器對象,數據庫的增刪改查可以通過模型的管理器實現

數據庫設置

打開 mysite/settings.py 。這是個包含了 Django 項目設置的 Python 模塊。

  • 使用 SQLite 以外的數據庫,請確認在使用前已經創建了數據庫。
  • 還要確保該數據庫用戶具有 “create database” 權限。

Django配置數據庫有兩種方法

方法一:直接在settings.py文件中添加數據庫配置信息

DATABASES = {

# 方法一
'default': {

'ENGINE': 'django.db.backends.mysql', # 數據庫引擎
'NAME': 'mysite', # 數據庫名稱
'USER': 'xiaohong', # 數據庫登錄用戶名
'PASSWORD': 'xiaohong', # 密碼
'HOST': '127.0.0.1', # 數據庫主機IP
'PORT': 3306, # 數據庫端口號
}
}
`'django.db.backends.sqlite3'`
`'django.db.backends.postgresql'`
`'django.db.backends.mysql'`
`'django.db.backends.oracle'`

直接使用出錯誤

django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?

安裝包

pip install pymysql

要在settings.py文件所在包中的__init__.py中導入pymysql

import pymysql
pymysql.install_as_MySQLdb()

如何使用見·模型使用

方法二:將數據庫配置信息存到一個文件中,在settings.py文件中將其引入。(推薦)

新建數據庫配置文件my.cnf(名字隨意選擇)

[client]
database = blog
user = blog
password = blog
host =127.0.0.1
port = 3306
default-character-set = utf8

在settings.py文件中引入my.cnf文件

DATABASES = {

# 方法二:
'default': {

'ENGINE': 'django.db.backends.mysql',
'OPTIONS': {

'read_default_file': 'utils/dbs/my.cnf',
},
}
}

字段類型

BooleanField()
數據庫類型:tinyint(1) -- 編程語言中:使用true或False來表示值
在數據庫中:使用1或0來表示具體的值
CharField()
數據庫類型:varchar
注意:必須要指定max_length參數值
DateField()
數據庫類型:date 表示日期√參數:
auto_now:每次保存對象時,自動設置該字段為當前時間(取值:True/False)
acto_now_add:當對象第一次被創建時自動設置當前時間(取值:True/False)
default:設置當前時間(取值:字符串格式時間如: '2019-6-1')。
以上三個參數只能多選一
DateTimeField()
數據庫類型:datetime(6) 表示日期和時間參數同DateField
FloatField()
數據庫類型:double
編程語言中和數據庫中都使用小數表示值
DecimalField()
數據庫類型:decimal(x,y)
編程語言中:使用小數表示該列的值√在數據庫中:使用小數
參數:
max_digits:位數總數,包括小數點後的位數。該值必須大於等於decimal_places.
decimal_places:小數點後的數字數量
EmailField()
數據庫類型:varchar
編程語言和數據庫中使用字符串
IntegerField()
數據庫類型:int
編程語言和數據庫中使用整數
lmageField()
數據庫類型varchar(100)
作用:在數據庫中為了保存圖片的路徑
編程語言和數據庫中使用字符串
TextField()
數據庫類型:longtext
作用:表示不定長的字符數據

字段選項

字段選項,指定創建的列的額外的信息

  • 允許出現多個字段選項,多個選項之間使用,隔開
primary_key
如果設置為True,表示該列為主鍵,如果指定一個字段為主鍵,則此數庫表不會創建id字段
blank (與null不同)
設置為True時,字段可以為空。設置為False時,字段是必須填寫的
null
如果設置為True,表示該列值允許為空。
默認為False,如果此選項為False,建議加入default選項來設置默認值
default
設置所在列的默認值,如果字段選項null=False建議添加此項
db_index
如果設置為True,表示為該列增加索引
unique
如果設置為True,表示該字段在數據庫中的值必須是唯一(不能重復出現的)
db_column
指定列的名稱,如果不指定的話則采用屬性名作為列名
verbose_name
設置此字段在admin界面上的顯示名稱
#創建一個屬性,表示用戶名稱,長度30個字符,必須是唯一的,不能為空,添加索引
name = models.charField(max_length=30,unique=True,nu77=False,db_index=True)

關系映射

在關系型數據庫中,通常不會把所有數據都放在同一張表中,不易於擴展,

常見關系映射有:

表關系
一對一映射
OneToOneField(類名, on_delete=xxx)
class B(mode1 .Mode1) :
屬性= models.oneTooneFie1d(類A,on_delete=??)
怎麼刪除
1.models.CASCADF級聯刪除。
Django模擬SQL約束ON DELETECASCADE的行為,並刪除包含ForeignKey的對象。
2.models.PROTECT 拋出ProtectedError 以阻止被引用對象的刪除;
[等同於mysql默認的RESTRICT]
3.SET_NULL設置ForeignKey null;
需要指定null=True
4.SET_DEFAULT 將ForeignKey設置為其默認值;
必須設置ForeignKey的默認值。
#創建數據
有外鍵的模型類
wife1 = Wife.objects.create(name='王夫人', author=author1)
#關聯王老師obj
wife1 = Wife.objects.create(name='王夫人';author_id=1)
# 關聯王老師對應主鍵值
#查詢
#正向查詢:直接通關外鍵屬性查詢,則稱為正向查詢
wife = wife.objects.get(name='王夫人')
print(wife.name,'的老公是',wife.author.name)
#反向查詢-沒有外鍵屬性的一方,可以調用反向屬性查詢到關聯的另一方
反向關聯屬性為`實例對象.引用類名(小寫),
-當反向引用不存在時,則會觸發異常
author1 = Author.objects.get(name='王老師')
author1.wife.name
一對多映射
一對多是表示現實事物間存在的一對多的對應關系。
#一對多需要明確出具體角色,在多表上設置外鍵
當一個A類對象可以關聯多個B類對象時
class A(mode1 . Mode1):一
class B (model.Mode1):
屬性= mode1s.ForeignKey("一"的模型類,on_delete=xx)
#創建數據
from .models import *
pub1= Publisher.objects.create(name='清華')
Book.objects.create(title='C++', publisher=pub1)
Book.objects.create(title='Java', publisher_id=1)
#查詢 A:B=1:多
類B obj.外鍵屬性.A屬性
類A obj.類B_set.all()
多對多映射
多對多表達對象之間多對多復雜關系,如:每個人都有不同的學校(小學,初中,高中...),每個學校都有不同的學生...
mysql中創建多對多需要依賴第三張表來實現
Django中無需手動創建第三張表,Django自動完成
#語法:在關聯的兩個類中的任意一個類中,
B 增加屬性= models.ManyToManyField(A)
#創建數據
先創建book再關聯author
book = Book.objects.create(title= ' python1 ' )
author3 = book.authors.create(name= ' guoxiaonao ' )
book.authors.add(author1)
#正向查詢有多對多屬性的對象查另一方
通過Book查詢對應的所有的Author
此時多對多屬性等價於objects
book.authors.a11() ->獲取book對應的所有的author的信息
book.authors.filter(age_gt=80) ->獲取book對應的作者中年齡大於80歲的作者的信息
#反向查詢
通過Author查詢對應的所有的Book利用反向屬性book_set
author.book_set.all()
author.book_set.filter()

創建數據

創建數據中每一條記錄就是創建一個數據對象方案1

1.
MyModel.objects.create(屬性1=值1,屬性2=值1..)
成功:返回創建好的實體對象
失敗:拋出異常
2. 創建MyModel 實例對象,並調用save()進行保存
obj = MyMode1(屬性=值,屬性=值)
obj.屬性=值
obj.save()

Django Shell

在Django提供了一個交互式的操作項目叫 Django Shell

它能夠在交互模式用項目工程的代碼執行相應的操作
利用Django Shell可以代替編寫view的代碼來進行直接操作

注意:項目代碼發生變化時,重新進入Django

shell啟動方式:
python manage.py shell
>>> from bookstore.models import Book
>>> b1=Book.objects.create(title='zzl',price='endless')
>>> b2=Book(title="qqq",price="1100")
>>> b2.save()
mysql> select * from bookstore_book;
+----+-------+---------+
| id | title | price |
+----+-------+---------+
| 1 | zzl | endless |
| 2 | qqq | 1100 |
+----+-------+---------+

查詢操作

數據庫的查詢需要使用管理器對象進行
通過MyModel.objects管理器方法調用查詢方法

簡單查詢
MyModel.objects.all()
查詢全部記錄,返回QuerySet查詢對象, [obj,obj2...]
def __str__(self):
retrun 顯示格式
僅僅查詢部分字段
MyModel.objects.values(字段1,字段2...)#使用類屬性,實則對數據庫字段操作
返回[{
},{
}]
MyModel.objects.values_list(字段1,字段2...)
返回[(),(),]
MyModel.objects.values(字段1,字段2...).order_by(字段1,字段2...)
返回[obj,obj2...]
條件查詢
#等式查詢
MyModel.objects.get(屬性=值1,..2,..3)
查詢符合條件的唯一記錄,如果不是1條數據,出錯
返回obj
MyModel.objects.filter(屬性=值1,..2,..3)
查詢符合所有條件的多條記錄
返回[obj,...]
MyModel.objects.exclude(屬性=值1,..2,..3)
查詢不符合條件的全部記錄
返回[obj,...]
#非等式查詢
查詢謂詞
定義:做更靈活的條件查詢時需要使用查詢謂詞
說明:每一個查詢謂詞是一個獨立的查詢功能
_exact:等值匹配
_contains :包含指定值
_startswith : 以XXX開始
_endswith :以XXX結束
_gt :大於
_gte :大於等於
_it :小於
_ite :小於等於
_in : (?_in=[,,])
_range :(?_range(a,b))
MyModel.objects.filter( 屬性_contains = 值1,..2,..3)

更新操作

1.

get(id=?)

2.

obj.屬性=?

3.save()

#批量修改
books = Book.objects.filter(id_gt=3)
books.update(price=O)
#將所有書的零售價定為100元
books = Book.objects.all()

刪除操作

1.查找數據對象
2.調用這個數據對象的delete()方法實現刪除

try:
auth = Author.objects.get(id=1)
auth.delete()
except:
print(刪除失敗)

F&Q

F

一個F對象代表數據庫中某條記錄的字段的信息作用:

通常是對數據庫中的字段值在不獲取的情況下進行操作-用於類屬性(字段)之間的比較。

from django . db .models import F
F('列名')
Book.objects.a11().update(market_price=F( 'market_price ')+10)
互斥執行

Q

在條件中用來實現除and(&)以外的or()或not(~)操作運算符:

&與操作
|或操作
&~非操作
from django. db.mode1s import Q
Q(條件1)|Q(條件2) # 條件1成立或條件2成立
Q(條件1)&Q(條件2) #條件1和條件2同時成立
Q(條件1)&~Q(條件2) #條件1成立且條件2不成立
book.objects.filter( Q()|Q() )

聚合查詢

聚合查詢是指對一個數據表中的一個字段的數據進行部分或全部進行統計查詢,

查bookstore_book數據表中的全部書的平均價格,

查詢所有書的總個數等,都要使用聚合查詢

聚合查詢分為

  • 整表聚合
導入方法: from django.db.models import *
聚合函數: Sum, Avg,Count,Max,Min
語法:MyModel.objects.aggregate(結果變量名=聚合函數('列'))
-返回結果:結果變量名和值組成的字典
格式為:{
結果變量名":值}
  • 分組聚合
分組聚合是指通過計算查詢結果中每一個對象所關聯的對象集合,
從而得出總計值(也可以是平均值或總和),即為查詢集的每一項生成聚合。
語法:
- QuerySet.annotate(結果變量名=聚合函數('列'))
返回值:
QuerySet
先分組
bs = Book.objects.values ( ' pub')
bs.annotate(res=Count( 'id' ) )
>>> <QuerySet [{
 'pub': '清華大學出版社','res': 2},{
 'pub': ‘機械工業出版社
bs.annotate(res=Count( 'id' ) ).filter(res_gt=1)

原生數據庫

Django也可以支持直接用sql語句的方式通信數據庫

查詢:
使用MyModel.objects.raw()進行數據庫查詢操作查詢
語法:
MyModel.objects.raw(sql語句,拼接參數)
返回值:
RawQuerySet集合對象【只支持基礎操作,比如循環】

完全跨過模型類操作數據庫-查詢/更新/刪除

1.導入cursor所在的包
from django.db import connection
⒉用創建cursor類的構造函數創建cursor對象,再使用cursor對象,

為保證在出現異常時能釋放cursor資源,通常使用with語句進行創建

from django.db import connection
with connection.cursor() as cur:
cur.execute('執行sQL語句','拼接參數')

數據庫使用

數據庫設置

打開 mysite/settings.py 。這是個包含了 Django 項目設置的 Python 模塊。

  • 使用 SQLite 以外的數據庫,請確認在使用前已經創建了數據庫。
  • 還要確保該數據庫用戶具有 “create database” 權限。

Django配置數據庫有兩種方法

方法一:直接在settings.py文件中添加數據庫配置信息

DATABASES = {

# 方法一
'default': {

'ENGINE': 'django.db.backends.mysql', # 數據庫引擎
'NAME': 'mysite', # 數據庫名稱
'USER': 'xiaohong', # 數據庫登錄用戶名
'PASSWORD': 'xiaohong', # 密碼
'HOST': '127.0.0.1', # 數據庫主機IP
'PORT': 3306, # 數據庫端口號
}
}
`'django.db.backends.sqlite3'`
`'django.db.backends.postgresql'`
`'django.db.backends.mysql'`
`'django.db.backends.oracle'`

直接使用出錯誤

django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?

安裝包

pip install pymysql

要在settings.py文件所在包中的__init__.py中導入pymysql

import pymysql
pymysql.install_as_MySQLdb()

如何使用見·模型使用

方法二:將數據庫配置信息存到一個文件中,在settings.py文件中將其引入。(推薦)

新建數據庫配置文件my.cnf(名字隨意選擇)

[client]
database = blog
user = blog
password = blog
host =127.0.0.1
port = 3306
default-character-set = utf8

在settings.py文件中引入my.cnf文件

DATABASES = {

# 方法二:
'default': {

'ENGINE': 'django.db.backends.mysql',
'OPTIONS': {

'read_default_file': 'utils/dbs/my.cnf',
},
}
}

字段類型

BooleanField()
數據庫類型:tinyint(1) -- 編程語言中:使用true或False來表示值
在數據庫中:使用1或0來表示具體的值
CharField()
數據庫類型:varchar
注意:必須要指定max_length參數值
DateField()
數據庫類型:date 表示日期√參數:
auto_now:每次保存對象時,自動設置該字段為當前時間(取值:True/False)
acto_now_add:當對象第一次被創建時自動設置當前時間(取值:True/False)
default:設置當前時間(取值:字符串格式時間如: '2019-6-1')。
以上三個參數只能多選一
DateTimeField()
數據庫類型:datetime(6) 表示日期和時間參數同DateField
FloatField()
數據庫類型:double
編程語言中和數據庫中都使用小數表示值
DecimalField()
數據庫類型:decimal(x,y)
編程語言中:使用小數表示該列的值√在數據庫中:使用小數
參數:
max_digits:位數總數,包括小數點後的位數。該值必須大於等於decimal_places.
decimal_places:小數點後的數字數量
EmailField()
數據庫類型:varchar
編程語言和數據庫中使用字符串
IntegerField()
數據庫類型:int
編程語言和數據庫中使用整數
lmageField()
數據庫類型varchar(100)
作用:在數據庫中為了保存圖片的路徑
編程語言和數據庫中使用字符串
TextField()
數據庫類型:longtext
作用:表示不定長的字符數據

字段選項

字段選項,指定創建的列的額外的信息

  • 允許出現多個字段選項,多個選項之間使用,隔開
primary_key
如果設置為True,表示該列為主鍵,如果指定一個字段為主鍵,則此數庫表不會創建id字段
blank (與null不同)
設置為True時,字段可以為空。設置為False時,字段是必須填寫的
null
如果設置為True,表示該列值允許為空。
默認為False,如果此選項為False,建議加入default選項來設置默認值
default
設置所在列的默認值,如果字段選項null=False建議添加此項
db_index
如果設置為True,表示為該列增加索引
unique
如果設置為True,表示該字段在數據庫中的值必須是唯一(不能重復出現的)
db_column
指定列的名稱,如果不指定的話則采用屬性名作為列名
verbose_name
設置此字段在admin界面上的顯示名稱
#創建一個屬性,表示用戶名稱,長度30個字符,必須是唯一的,不能為空,添加索引
name = models.charField(max_length=30,unique=True,nu77=False,db_index=True)

關系映射

在關系型數據庫中,通常不會把所有數據都放在同一張表中,不易於擴展,

常見關系映射有:

表關系
一對一映射
OneToOneField(類名, on_delete=xxx)
class B(mode1 .Mode1) :
屬性= models.oneTooneFie1d(類A,on_delete=??)
怎麼刪除
1.models.CASCADF級聯刪除。
Django模擬SQL約束ON DELETECASCADE的行為,並刪除包含ForeignKey的對象。
2.models.PROTECT 拋出ProtectedError 以阻止被引用對象的刪除;
[等同於mysql默認的RESTRICT]
3.SET_NULL設置ForeignKey null;
需要指定null=True
4.SET_DEFAULT 將ForeignKey設置為其默認值;
必須設置ForeignKey的默認值。
#創建數據
有外鍵的模型類
wife1 = Wife.objects.create(name='王夫人', author=author1)
#關聯王老師obj
wife1 = Wife.objects.create(name='王夫人';author_id=1)
# 關聯王老師對應主鍵值
#查詢
#正向查詢:直接通關外鍵屬性查詢,則稱為正向查詢
wife = wife.objects.get(name='王夫人')
print(wife.name,'的老公是',wife.author.name)
#反向查詢-沒有外鍵屬性的一方,可以調用反向屬性查詢到關聯的另一方
反向關聯屬性為`實例對象.引用類名(小寫),
-當反向引用不存在時,則會觸發異常
author1 = Author.objects.get(name='王老師')
author1.wife.name
一對多映射
一對多是表示現實事物間存在的一對多的對應關系。
#一對多需要明確出具體角色,在多表上設置外鍵
當一個A類對象可以關聯多個B類對象時
class A(mode1 . Mode1):一
class B (model.Mode1):
屬性= mode1s.ForeignKey("一"的模型類,on_delete=xx)
#創建數據
from .models import *
pub1= Publisher.objects.create(name='清華')
Book.objects.create(title='C++', publisher=pub1)
Book.objects.create(title='Java', publisher_id=1)
#查詢 A:B=1:多
類B obj.外鍵屬性.A屬性
類A obj.類B_set.all()
多對多映射
多對多表達對象之間多對多復雜關系,如:每個人都有不同的學校(小學,初中,高中...),每個學校都有不同的學生...
mysql中創建多對多需要依賴第三張表來實現
Django中無需手動創建第三張表,Django自動完成
#語法:在關聯的兩個類中的任意一個類中,
B 增加屬性= models.ManyToManyField(A)
#創建數據
先創建book再關聯author
book = Book.objects.create(title= ' python1 ' )
author3 = book.authors.create(name= ' guoxiaonao ' )
book.authors.add(author1)
#正向查詢有多對多屬性的對象查另一方
通過Book查詢對應的所有的Author
此時多對多屬性等價於objects
book.authors.a11() ->獲取book對應的所有的author的信息
book.authors.filter(age_gt=80) ->獲取book對應的作者中年齡大於80歲的作者的信息
#反向查詢
通過Author查詢對應的所有的Book利用反向屬性book_set
author.book_set.all()
author.book_set.filter()

入門使用

創建項目

>django-admin startproject mysite1
#創建的目錄結構
''' mysite1/ manage.py mysite1/ __init__.py settings.py urls.py asgi.py wsgi.py '''
  • 最外層的mysite1/根目錄只是你項目的容器
  • manage.py: 一個讓你用各種方式管理 Django 項目的命令行工具
  • 裡面一層的mysite1/ 包含你的項目
    • mysite1/init.py:一個空文件,告訴 Python 這個目錄應該被認為是一個 Python 包。
    • mysite1/settings.py:Django 項目的配置文件。
    • mysite1/urls.py:Django 項目的 URL 聲明,就像網站的“目錄”。
    • mysite1/asgi.py:運行在ASGI的Web服務器上的入口。
    • mysite1/wsgi.py:運行在WSGI的Web服務器上的入口。

pycharm配置

  • 下載破解版pycharm,支持Django
  • file–>setting 設置解釋器
    • 添加新的虛擬環境,location在項目文件夾下venv,base interpreter為下載的python3.8
    • 勾選inherit global …這樣會帶有Django的包
    • 前提是之前已經下載安裝了Django

  • 設置Django的工程目錄。setting.py路徑,和 manage.py 路徑

  • 最後在run , configuration新建Django服務,配置站點ip端口等

運行項目

進入外層的mysite目錄的話,請切換到此目錄,然後運行下面的命令:

$ python manage.py runserver (ip:port)

訪問http://127.0.0.1:8000/看到成功界面

//啟動了 Django 自帶的用於開發的簡易服務器,它是一個用純 Python 編寫的輕量級的 Web 服務器。
這個服務器內置在 Django 中是為了讓你能快速的開發出想要的的東西,

創建應用(startapp)

項目 VS 應用
項目和應用有什麼區別?應用是一個專門做某事的網絡應用程序——比如博客系統,或者公共記錄的數據庫,或者小型的投票程序。項目則是一個網站使用的配置和應用的集合。項目可以包含很多個應用。應用可以被很多個項目使用。

在 Django 中,每個應用都是 Python 包,並且遵循相同的約定。Django 自帶一個工具,可以幫助生成應用的基礎目錄結構

  • manage.py同級目錄下創建投票應用。這樣它就可以作為頂級模塊導入,不是而mysite的子模塊。
python manage.py startapp polls
'''這個結構目錄包括了投票應用的全部內容。 polls/ __init__.py admin.py apps.py migrations/ __init__.py models.py tests.py views.py '''

創建view

進入polls/view.py,寫視圖

from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")

這是 Django 中最簡單的視圖。

  • 如果想看見效果,我們需要將一個 URL 映射到它
    • ——這就是我們需要 URLconf 的原因

為了創建 URLconf,在polls目錄中新建一個urls.py

polls/urls.py中,輸入如下代碼:

from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]

下一步是要在根 URLconf 文件中指定我們創建的polls.urls模塊。

mysite/urls.py文件的裡面urlpatterns插入一個include()

from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('polls/', include('polls.urls')),
path('admin/', admin.site.urls),
]

函數include()允許引用其他 URLconfs。刪除 Django 遇到include()時,它會截斷與插入匹配的 URL 的部分,將腳本的字符串發送到 URLconf 以供進一步處理。

創建模型(數據庫表)

在 Django 裡寫一個數據庫驅動的 Web 應用的第一步是定義模型 - 也就是數據庫結構設計和附加的其它元數據

設計哲學
# 一個模型就是單個定義你的數據的信息源。
# 模型中包含了不可缺少的數據區域和你存儲數據的行為。
# Django 遵循 DRY 原則。目的就是定義你的數據模型要在一位置上,而且自動從該位置推導一些事情。
來介紹一下遷移 - 舉個例子,不像 Ruby On Rails,Django 的遷移代碼是由你的模型文件自動生成的,它本質上是個歷史記錄,Django 可以用它來進行數據庫的滾動更新,通過這種方式使其能夠和當前的模型匹配。

投票應用中,需要創建兩個模型:問題Question和選項Choice

  • Question模型包括問題描述和發布時間。
  • Choice模型有兩個字段,選項描述和當前得票數。每個選項是一個問題。

編輯polls/models.py文件:

from django.db import models
#每個模型django.db.models.Model有許多類變量,
# -->它們都表示模型裡的一個數據庫字段。
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
#幾乎所有字段Field的實例
#字符字段被表示為CharField,
#日期時間字段被表示為DateTimeField。
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
# 定義部分Field 類實例需要參數。
# 例如CharField 需要一個max_length 參數。這個參數的用處用於定義數據庫結構,也用於驗證數據,我們很快就會看到這方面的內容。
# Field 也能夠接收若干可選參數;在上面的例子中:我們將votes的default也就是默認值,設為0。
# 我們使用ForeignKey定義了一個關系。
這將告訴 Django,每個Choice對象都關聯到一個 Question 對象。Django 支持所有常用的數據庫關系:多對一、多對多和一對一。

激活模型

Django 可以通過創建模型的代碼:

  • 為這個應用創建數據庫模式(生成語句)。CREATE TABLE
  • 創建可以與QuestionChoice對象進行交互的 Python 數據庫 API

但是首先要把polls應用安裝到我們的項目裡。

# 設計哲學
Django 應用是“可插拔”的。你可以在多個項目中使用同一個。除此之外,你還可以發布自己的應用,因為它們並不會被綁定到當前安裝的Django 上。
  • 為了在我們的工程中包含這個應用,需要我們在配置類INSTALLED_APPS中添加設置。因為PollsConfig類寫在文件polls/apps.py中,所以它的路徑是'polls.apps.PollsConfig'

site/setting.py

INSTALLED_APPS = [
'polls.apps.PollsConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]

site/polls/app.py

from django.apps import AppConfig
class PollsConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'polls'

現在 Django 項目會包含polls 應用程序。運行下面的命令:

$ python manage.py makemigrations polls

Cookie&Session

  • 會話

從打開浏覽器訪問一個網站,到關閉浏覽器結束此次訪問,稱之為一次會話
HTTP協議是無狀態的,導致會話狀態難以保持

Cookies保存在客戶端浏覽器上的存儲空間

Chrome浏覽器通過開發者工具的Application >>Storage >> Cookies查看和操作浏覽器端所有的Cookies值
火狐浏覽器可能通過開發者工具的存儲-> Cookie查看

1.cookies在浏覽器上是以鍵-值對的形式進行存儲的,
鍵和值都是以ASCII字符串的形存儲(不能是中文字符串)
2.存儲的數據帶有生命周期
3.cookies中的數據是按域存儲隔離的,不同的域之間無法訪問
4.cookies的內部的數據會在每次訪問此網址時都會攜帶到服務器端,如果cookies過大會降低響應速度
服務端響應Cookie設置
HttpResponse.set_cookie(key, value=", max_age=None,expires=None)
- key:cookie的名字
- value:cookie的值
- max_age:cookie存活時間,秒為單位
- expires:具體過期時間
-當不指定max age和expires時,關閉浏覽器時此數據失效
resp = HttpResponse( 'set cookies is ok' )
resp.set_cookie( ' uuname ' , 'gxn' ,500)
#添加cookie,修改cookie
#為浏覽器添加鍵為my_var1,值為123,過期時間為1個小時的cookie
responds = HttpResponse("已添加my_var1,值為123")
responds.set_cookie( 'my_var1',123,3600)
return responds
#刪除Cookies
- HttpResponse.delete_cookie(key)
-刪除指定的key的Cookie。如果key不存在則什麼也不發生
#獲取Cookies
-通過request.COOKIES綁定的字典(dict)
#獲取客戶端的COOKIES數據
value = request.COOKIES.get('cookies名','默認值')

Session在服務器上開辟一段空間用於保留浏覽器和服務器交互時的重要數據

實現方式

-使用session需要在浏覽器客戶端啟動cookie,且在cookie中存儲sessionid
-每個客戶端都可以在服務器端有一個獨立的Session
-注意:不同的請求者之間不會共享這個數據,與請求者一一對應

配置

settings.py中配置session
1,向INSTALLED_APPS列表中添加:
INSTALLED_APPS = [
#啟用sessions應用
'django.contrib.sessions ' ,
]
2,向MIDDLEWARE列表中添加:
MIDDLEWARE = [
#啟用session中間件
'django.contrib.sessions.middleware.sessionMiddleware'
]

使用

session對於象是一個類似於字典的SessionStore類型的對象,
可以用類擬於字典的方式進行操作
session 能夠存儲如字符串,整型,字典,列表等。
1,保存session的值到服務器
request.session['KEY'] = VALUE
2,獲取session的值
value = request.session['KEY']
value = request.session.get('KEY',默認值)
3,刪除session
del request.session['KEY"]
def set_session( request) :
request.session [ ' uname' ] = 'wwc'
return HttpResponse( ' set session is ok')
def get_session( request) :
value = request.session [ ' uname ' ]
return HttpResponse( 'session value is %s '%(valuel))

使用

settings.py中相關配置項
1,SESSION_COOKJE_AGE
作用:指定sessionid在cookies中的保存時長(默認是2周),
如例如:SESSION_COOKIE_AGE = 60* 60 * 24*7* 2
2, SESSION_EXPIRE_AT_BROWSER_CLOSE= True
設置只要浏覽器關閉時,session就失效(默認為False)
注意:Django中的session數據存儲在數據庫中
,所以使用session前需要確保已經執行過migrate
1, django_session表是單表設計;
且該表數據量持續增持【浏覽器故意刪掉sessionid&過期數據未刪除】
2,可以每晚執行python3 manage.py clearsessions
【該命令可刪除已過期的session數據】

Admin後台

django提供了比較完善的後台管理數據庫的接口,

可供開發過程中調用和測試使用

django 會搜集所有已注冊的模型類,

為這些模型類提拱數據管理界面,供開發者使用

創建後台管理帳號–該賬號為管理後台最高權限賬號
$ python3 manage.py createsuperuser

函數

path()

函數有path()四個參數,兩個必須參數:routeview,兩個任選參數:kwargsname

  • route是一個匹配 URL 的准則(類似正則表達式)。當 Django 響應一個請求時,它會從urlpatterns第一項開始,按順序排列匹配列表中的項,直到找到匹配項。

這些特征不會匹配 GET 和 POST 參數或域名。例如,URLconf 處理請求請求https://www.example.com/myapp/時,它會嘗試匹配myapp/。處理請求https://www.example.com/myapp/?page=3時,也可以嘗試匹配myapp/

  • 當姜戈找到了一個匹配的模型,就會調用特定的這個視圖,並同時調用一個HttpRequest對象第一個參數,被“作為”參數的參數以關鍵字參數的形式呈現。

  • kwargs 任意一個關鍵字參數可以作為一個字典傳遞給目標視圖函數。

  • name 為你的 URL 取名可以讓你在 Django 的某個地方唯一的這個地引用它,尤其是在模板中特殊的特性允許你只改一個文件外部地修改某個 URL 模式。

render()

**render()**語法如下:

def render(request, template_name, context=None, content_type=None,
status=None, using=None)

render 的參數 request 和 template name 是必需參數,其余的參數是可選參數。各個參數說明如下。

  • request:浏覽器向服務器發送的請求對象,包含用戶信息、請求內容和請求方式等。
  • template_name:設重模板文件名,用於生成網頁內容。
  • context:對模板上下文(模板變量)賦值,以字典格式表示,默認情況下是一個空字典。
  • content_type:響應內容的數據格式,一般情況下使用默認值即可。
  • status:HTTP狀態碼,默認為200。
  • using:設置模板引擎,用於解析模板文件,生成網頁內容。

HttpResponseRedirect

Django中提供了HttpResponseRedirect對象實現重定向功能,這個類繼承自HttpResponse,被定義在django.http模塊中,返回的狀態碼為302。

功能

URL

絕對地址
http://127.0.0.1:8000/page/12,
相對地址
'/page/1'
‘/’開頭的相對地址,
浏覽器會把當前地址欄裡的協議,ip和端口加上這個地址,作為最終訪問地址,
即如果當前頁面地址欄為http://127.0.0.1:8000/page/3;當前相對地址最終結果為http://127.0.0.1:8000 + /page/1
'page/1’
沒有‘/開頭的相對地址,
浏覽器會根據當前url的最後一個/之前的內容加上該相對地址作為最終訪問地址,
例如當前地址欄地址為http://127.0.0.1:8000/topic/detail;則該相對地址最終結果為http://127.0.0.1:8000/topic/ + page/1

url反向解析

url反向解析是指在視圖或模板中,

用path定義的名稱來動態查找或計算出相應的路由

path函數的語法
path(route, views, name="別名")
path(page', views.page_view, name="page_url")
根據path中的`name=`關鍵字傳參給url確定了個唯一確定的名字
在模板或視圖中,可以通過這個名字反向推斷出此url信息
模板中使用url標簽實現地址的反向解析
{
% url‘別名’%}
{
% url '別名’'參數值1''參數值2’%}
{
% ur1 'pagen''400’%}
{
% url 'person' age='18' name=' gxn'%}
在視圖函數中->可調用django中的reverse方法進行反向解析
from django.urls import reverse
url=reverse('別名',args=[],kwargs={
})

url跳轉&頁面跳轉&傳參

URL跳轉

url跳轉也表示 調用path函數進行views視圖處理
url跳轉形式
1.通過html標簽鏈接,表單鏈接
2.通過redict函數

請求傳參的四種方式

  • URL路徑 ( …/123 )
  • GET請求 (…?a=? )
  • 請求體 表單等 (form …)
  • 報文頭header 裡 (cookie)

1.URL

path(r'<int>/<int>',a)
def a(request,item1,item2):
return HttpResponse()

get

Django中的請求

  • 請求在Django中,就是視圖函數的第一個參數,即HttpRequest對象
  • Django接收到http協議的請求後,會根據請求數據報文創建HttpRequest對象
  • HttpRequest對象通過屬性描述了請求的所有相關信息
path_info: URL字符串
method: 字符串,表示HTTP請求方法,常用值:'GET'、'POST
GET: QueryDict查詢字典的對象,包含get請求方式的所有數據
POST: QueryDict查詢字典的對象,包含post請求方式的所有數據
FILES: 類似於字典的對象,包含所有的上傳文件信息
COOKIES: Python字典,包含所有的cookie,鍵和值都為字符串
session: 似於字典的對象,表示當前的會話
body: 字符串,請求體的內容(POST或PUT)
scheme: 請求協議('http' /'https')
request.get_full _path()∶ 請求的完整路徑
request.META: 請求中的元數據(消息頭)
客戶端IP地址 -> request.META['REMOTE_ADDR'] :
#在視圖函數輸出
def test_request ( request) :
print( ' path info is' , request.path_info)
print ( ' method is', request.method)
print ( ' querystring is' , request.GET)
return HttpResponse( ' test request ok' )

Django響應

構造函數格式:

HttpResponse(content=響應體,content_type=響應體數據類型, status=狀態碼)
作用:
向客戶端浏覽器返回響應,同時攜帶響應體內容

常用的Content-Type如下
>
- 'text/html’(默認的,html文件)
- 'text/plain’(純文本)
- 'text/css’(css文件)
- 'text/javascript'(js文件)
- 'multipart/form-data’(文件提交)
- 'application/json'(json傳輸)
- 'application/xml’(xml文件)

請求響應

GET

- 浏覽器地址欄中輸入URL,回車後
- <a href="地址?參數=值&參數=值">
- form表單中的method為get

POST

客戶端通過表單等POST請求將數據傳遞給服務器端,如:
<form method=' post' action=" /login">
<input type="text" name="username">
<input type= 'submit' value='登陸'>
</form>

Django的get,POST請求都在視圖函數響應

def test_get_post( request) :
if request.method == 'GET" :
#request.GET字典
request.GET['參數名']
request.GET.get('參數','默認值') #無參有默認值,不出錯
request.GET.getlist('參數') #取所有值 
elif request.method == "'POST' :
request.POST['參數名']# request.PoST綁定QueryDict
request.PoST.get('參數名','')
request.POST.getList('參數名')
#取消csrf驗證,否則Django將會拒絕客戶端發來的POST請求,報403響應
''' 取消csrf 驗證 -禁止掉settings.py 中 MIDDLEWARE中的CsrfViewsMiddleWare的中間件 MIDDLEWARE = [ #注釋掉 ' django.middleware.csrf.csrfviewMiddleware ', ] '''
else:
pass
return HttpResponse( '--test get post is ok-- ' )

setting文件

  • 編輯 mysite/settings.py 文件前,先設置 TIME_ZONE 為你自己時區。

此外,關注一下文件頭部的 INSTALLED_APPS 設置項。這裡包括了會在你項目中啟用的所有 Django 應用。應用能在多個項目中使用,也可以打包並且發布應用,讓別人使用。

通常, INSTALLED_APPS 默認包括了以下 Django 的自帶應用:
django.contrib.admin -- 管理員站點, 你很快就會使用它。
django.contrib.auth -- 認證授權系統。
django.contrib.contenttypes -- 內容類型框架。
django.contrib.sessions -- 會話框架。
django.contrib.messages -- 消息框架。
django.contrib.staticfiles -- 管理靜態文件的框架。
這些應用被默認啟用是為了給常規項目提供方便。

默認開啟的某些應用需要至少一個數據表,所以,在使用他們之前需要在數據庫中創建一些表。執行以下命令:

$ python manage.py migrate
#這個 migrate 命令檢查 INSTALLED_APPS 設置,為其中的每個應用創建需要的數據表,
至於具體會創建什麼,這取決於你的 mysite/settings.py 設置文件和每個應用的數據庫遷移文件(我們稍後會介紹這個)。這個命令所執行的每個遷移操作都會在終端中顯示出來。如果你感興趣的話,運行你數據庫的命令行工具,並輸入 \dt (PostgreSQL)、SHOW TABLES; (MariaDB,MySQL)、.schema (SQLite)或者 SELECT TABLE_NAME FROM USER_TABLES; (Oracle)來看看 Django 到底創建了哪些表

路由配置

https://docs.djangoproject.com/zh-hans/3.2/topics/http/urls/

urls.py的urlparttern中配置對應的view函數寫在view.py中

1.路由配置- path

  • path()函數

    • 導入 from django.urls import path

    • 語法– path(route, views, name=None)

    • 參數:

      • route:字符串類型,匹配的請求路徑

      • views:指定路徑所對應的視圖處理函數的名稱

      • name:為地址起別名,在模板中地址反向解析時使用

2.路由配置- path -轉換器

#path轉換器
1·語法:/<轉換器類型:自定義名>
2·作用:若轉換器類型匹配到對應類型的數據,則將數據按照關鍵字傳參的方式傳遞給視圖函數
3·例子: path('page/<int:page>', views.xxx)
#把int型變量page 以關鍵字傳參形式 傳給視圖函數view.XXX
如 path('src/<int:value>',view.test)
view函數
def test(request,value):#加上第二個參數value
return HttpResponse()

下面的路徑在默認情況下是有效的:

  • str- 匹配'/'之外的非空字符串。如果表達式內不包含轉換,默認匹配字符串。

  • int- 匹配0或任何正瞬間。返回一個int

  • slug- 匹配任意由 ASCII 字母數字或連字符和下劃線組成的短標簽building-your-1st-django-site

  • uuid- 匹配一個格式的 UUID。為了防止多個 URL 映射到一個頁面,必須包含破折號並且字符都為小寫。例如,075194d3-6885-417e-a8a8-6c931e272f00。返回一個UUID實例。

  • path- 匹配非空域,包括路徑提示符'/'。它允許你匹配完整的 URL,而不是像str那樣匹配 URL 的部分。

注冊自定義的路徑轉換器

為了更復雜的匹配需求,你能定義你自己的路徑轉換器。

轉換是一個類,包含如下內容:

  • 字符串形式的regex類屬性。
  • to_python(self, value)方法,可以選擇處理匹配的字符串轉換為函數的類型。如果沒有轉換為給定的值,它應該會引發ValueErrorValueError說明沒有匹配成功,因此有另一種 URL 模式匹配成功,否則會向用戶發送404響應。
  • to_url方法, 轉換 Python 類型為字符串用於 URL 中。如果不能轉換給定的值,會引起error

例如:

class FourDigitYearConverter:
regex = '[0-9]{4}'
def to_python(self, value):
return int(value)
def to_url(self, value):
return '%04d' % value

在 URLconf 中使用register_converter()來注冊自定義的轉換類:

from django.urls import path, register_converter
from . import converters, views
register_converter(converters.FourDigitYearConverter, 'yyyy')
urlpatterns = [
path('articles/2003/', views.special_case_2003),
path('articles/<yyyy:year>/', views.year_archive),
...
]

使用正則表達式

如果路徑和轉換器語法不足以定義您的 URL 模式,您還可以使用正則表達式。為此,請使用 re_path()代替path()

在 Python 正則表達式中,命名正則表達式組的語法是(?P<name>pattern),其中name是組的名稱和 pattern一些要匹配的模式。

urlpatterns[
# r'^ 是開頭,
# (?P<name>pattern)為分組匹配,可限制位數等
# $為結尾 
re_path(r"^(?P<x>\d{
1,2})/( ?P<op>\w+)/( ?P<y>\d[1,2}$)',views.cal2_view)
//類似於
path( '<int:n>/<str:op=/<int:m>', views.cal_view) ,
]

基礎

Django中的請求

  • 請求在Django中,就是視圖函數的第一個參數,即HttpRequest對象
  • Django接收到http協議的請求後,會根據請求數據報文創建HttpRequest對象
  • HttpRequest對象通過屬性描述了請求的所有相關信息
path_info: URL字符串
method: 字符串,表示HTTP請求方法,常用值:'GET'、'POST
GET: QueryDict查詢字典的對象,包含get請求方式的所有數據
POST: QueryDict查詢字典的對象,包含post請求方式的所有數據
FILES: 類似於字典的對象,包含所有的上傳文件信息
COOKIES: Python字典,包含所有的cookie,鍵和值都為字符串
session: 似於字典的對象,表示當前的會話
body: 字符串,請求體的內容(POST或PUT)
scheme: 請求協議('http' /'https')
request.get_full _path()∶ 請求的完整路徑
request.META: 請求中的元數據(消息頭)
客戶端IP地址 -> request.META['REMOTE_ADDR'] :
#在視圖函數輸出
def test_request ( request) :
print( ' path info is' , request.path_info)
print ( ' method is', request.method)
print ( ' querystring is' , request.GET)
return HttpResponse( ' test request ok' )

Django響應

構造函數格式:

HttpResponse(content=響應體,content_type=響應體數據類型, status=狀態碼)
作用:
向客戶端浏覽器返回響應,同時攜帶響應體內容

常用的Content-Type如下
>
- 'text/html’(默認的,html文件)
- 'text/plain’(純文本)
- 'text/css’(css文件)
- 'text/javascript'(js文件)
- 'multipart/form-data’(文件提交)
- 'application/json'(json傳輸)
- 'application/xml’(xml文件)

http請求

GET,POST最常用

http1.0

  • GET

    • 請求指定的頁面信息,並返回實體主體
  • HEAD (測試)

    • 類似於get請求,只不過返回的響應中沒有具體的內容,用於獲取報頭
  • POST

    • 向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中,可能會導致新的資源的建立和/或已有資源的修改。

HTTP1.1新增

  • PUT (更新數據)

    • 從客戶端向服務器傳送的數據取代指定的文檔的內容。
  • DELETE (刪除)

    • 請求服務器刪除指定的頁面。
  • CONNECT (代理)

    • HTTP/1.1協議中預留給能夠將連接改為管道方式的代理服務器。
  • OPTIONS (協商)

    • 允許客戶端查看服務器的性能。
  • TRACE (鏈路測試)

    • 回顯服務器收到的請求,主要用於測試或診斷。

HTTP響應

下面是常見的HTTP狀態碼:

  • 200-請求成功
  • 301 -永久重定向-資源(網頁等)被永久轉移到其它URL-
  • 302-臨時重定向
  • 404-請求的資源(網頁等)不存在
  • 500–內部服務器錯誤
五大類狀態碼
1** 服務器收到請求,需要請求者繼續執行操作
2** 成功,操作被成功接收並處理
3** 重定向,需要進一步的操作以完成請求
4** 客戶端錯誤,請求包含語法錯誤或無法完成請求
5** 服務器錯誤,服務器在處理請求的過程中發生了錯誤

項目開發

  • 項目組成員角色
    • 產品/運營經理:負責產品功能細節的把控
    • 開發
      • 前端–負責顯示部分內容的開發【多】
      • 後端–負責服務器部分的功能開發【少】
    • 運維–管理linux服務器,組件化配置,安全問題
    • 測試–負責找出產品功能的問題【BUG】
    • 美術-負責產品素材方面得繪制

詢字典的對象,包含get請求方式的所有數據
POST: QueryDict查詢字典的對象,包含post請求方式的所有數據
FILES: 類似於字典的對象,包含所有的上傳文件信息
COOKIES: Python字典,包含所有的cookie,鍵和值都為字符串
session: 似於字典的對象,表示當前的會話
body: 字符串,請求體的內容(POST或PUT)
scheme: 請求協議(‘http’ /‘https’)
request.get_full _path()∶ 請求的完整路徑
request.META: 請求中的元數據(消息頭)
客戶端IP地址 -> request.META[‘REMOTE_ADDR’] :

#在視圖函數輸出
def test_request ( request) :
print( ’ path info is’ , request.path_info)
print ( ’ method is’, request.method)
print ( ’ querystring is’ , request.GET)
return HttpResponse( ’ test request ok’ )


## Django響應
構造函數格式:
> HttpResponse(content=響應體,content_type=響應體數據類型, status=狀態碼)
> 作用:
> 向客戶端浏覽器返回響應,同時攜帶響應體內容
```sh
常用的Content-Type如下
>
- 'text/html’(默認的,html文件)
- 'text/plain’(純文本)
- 'text/css’(css文件)
- 'text/javascript'(js文件)
- 'multipart/form-data’(文件提交)
- 'application/json'(json傳輸)
- 'application/xml’(xml文件)

[外鏈圖片轉存中…(img-YnXkW921-1642079895356)]

http請求

GET,POST最常用

[外鏈圖片轉存中…(img-NgqhpSNT-1642079895356)]

[外鏈圖片轉存中…(img-HFnux1UU-1642079895357)]

http1.0

  • GET

    • 請求指定的頁面信息,並返回實體主體
  • HEAD (測試)

    • 類似於get請求,只不過返回的響應中沒有具體的內容,用於獲取報頭
  • POST

    • 向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中,可能會導致新的資源的建立和/或已有資源的修改。

HTTP1.1新增

  • PUT (更新數據)

    • 從客戶端向服務器傳送的數據取代指定的文檔的內容。
  • DELETE (刪除)

    • 請求服務器刪除指定的頁面。
  • CONNECT (代理)

    • HTTP/1.1協議中預留給能夠將連接改為管道方式的代理服務器。
  • OPTIONS (協商)

    • 允許客戶端查看服務器的性能。
  • TRACE (鏈路測試)

    • 回顯服務器收到的請求,主要用於測試或診斷。

HTTP響應

[外鏈圖片轉存中…(img-UNX4USQh-1642079895357)]

[外鏈圖片轉存中…(img-VvJF5OBc-1642079895358)]

下面是常見的HTTP狀態碼:

  • 200-請求成功
  • 301 -永久重定向-資源(網頁等)被永久轉移到其它URL-
  • 302-臨時重定向
  • 404-請求的資源(網頁等)不存在
  • 500–內部服務器錯誤
五大類狀態碼
1** 服務器收到請求,需要請求者繼續執行操作
2** 成功,操作被成功接收並處理
3** 重定向,需要進一步的操作以完成請求
4** 客戶端錯誤,請求包含語法錯誤或無法完成請求
5** 服務器錯誤,服務器在處理請求的過程中發生了錯誤

項目開發

  • 項目組成員角色
    • 產品/運營經理:負責產品功能細節的把控
    • 開發
      • 前端–負責顯示部分內容的開發【多】
      • 後端–負責服務器部分的功能開發【少】
    • 運維–管理linux服務器,組件化配置,安全問題
    • 測試–負責找出產品功能的問題【BUG】
    • 美術-負責產品素材方面得繪制

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved