1、Django框架的使用
1.1、安裝Djnago Web框架
使用pip安裝,命令如下
pip install django == 2.2 # 安裝 2.2版本的Django
1.2、什麼是virtualenv及windows下如何配置
virtualenv是一個創建隔絕的Python環境的工具。virtualenv創建一個包含所有必要的可執行文件的文件夾,用來使用Python工程所需的包。簡單的說就是一個隔絕的python環境,在開發不同的程序的時候,往往需要在不同的環境下開發,每個應用可能需要各自一套"獨立"的運行環境, virtualenv就是爲此而生,用來創建一套這樣的"隔離"的運行環境. virtualenv其操作簡單,在大多數IDE中能容易的嵌合。最簡單的說法就是Virtualenv 是Python中的虛擬環境管理工具。
windows下如何配置virtualenv,參考這篇文章
1.3、創建Django項目
1.31、使用django-admin命令創建項目
django-admin startproject demo
創建完成後,有以下幾個文件
文件說明
文件 | 說明 |
---|---|
manage.py | Django程序執行入口 |
db.sqlite3 | SQlite的數據庫文件,Django默認使用這種小型數據庫存取數據,非必須保留 |
template | Django生成的HTML模板文件夾,我們也可以在每個App中使用模板文件夾 |
demo | Django生成的和項目同名的配置文件夾 |
setting.py | Django總的配置文件,可以配置App、數據庫、中間件等選項 |
urls.py | Django默認的路由配置選項 |
wsgi.py | Django實現的WSGI接口的文件,用來處理Web請求 |
1.32、運行項目
使用以下命令
python manage.py runserver
然後根據提示可得web服務器已經在監聽8000端口的請求。在瀏覽器中輸入http:/127.0.0.1:8000就可以看到創建的Django項目界面。
1.33、創建數據表及賬號密碼
使用以下命令
python manage.py migrate # 執行數據庫遷移生成的數據表
python manage.py createsuperuser # 按照提示輸入賬號密碼,密碼強度符號一定要求
然後重啓啓動服務器,在瀏覽器中訪問http:/127.0.0.1:8000/admin,使用剛剛創建的賬號密碼就可以登入後臺
1.4、創建App
在命令行使用以下代碼
python manage.py startapp app1
demo目錄裏會多了app1目錄
Django項目中App目錄的文件說明
文件 | 說明 |
---|---|
migrations | 執行數據庫遷移生成的腳本 |
admin.py | 配置數據庫遷移生成的腳本 |
apps.py | 單獨配置添加的每個App的文件 |
models.py | 創建數據庫數據模型對象的文件 |
tests.py | 用來編寫測試腳本的文件 |
views.py | 用來編寫視圖控制器的文件 |
接下來將創建的APP添加到demo目錄下的setting.py配置文件裏,將其激活(否則APP目錄不生效)
激活命令如下
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app1',
]
1.5、數據模型(models)
1.51、在App中添加數據模型
在app1的models.py中添加以下代碼
from django.db import models
# Create your models here.
class Person(models.Model):
"""
編寫Person模型類,數據模型應該繼承models.Model或者其子類
"""
# 第一個字段使用models.CharFiles類型
first_name = models.CharField(max_length=30)
# 第二個字段使用models.CharFiles類型
last_name = models.CharField(max_length=30)
Person模型中的每一個屬性都指明瞭models下面的一個數據類型,代表了數據庫中的一個字段。上面的類在數據庫中會創建以下的表:
CREATE TABLE myapp_person (
"id" serial NOT NULL PRIMARY KEY,
"first_name" varchar(30) NOT NULL,
"last_name" varchar(30) NOT NULL
);
1.52、執行數據庫遷移
在完成數據庫模型的建立後,我們希望使用mysql數據庫,而不是Django自帶的SQLite數據庫。我們要使用MySql數據庫,需要進行一下操作
1、進行setting.py配置
把下面代碼註釋掉
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
然後再添加下面代碼
DATABASES = {
'default':{
'ENGINE': 'django.db.backends.mysql',
'NAME': 'demo', # 數據庫名稱
'USER': 'root', # 用戶名
'PASSWORD': '密碼',
}
}
2、連接mysql數據庫,然後在mysql命令行中創建數據庫
create database demo default character set utf8;
3、安裝數據庫驅動
pip install pymysql
4、在D:\Python\Webprojects\l_env\Scripts\demo\demo目錄下的__init__.py文件的手行添加下面代碼
import pymysql
pymysql.install_as_MySQLdb() # 爲了將pymysql發揮最大數據庫操作性能
5、生成遷移文件
python manage.py makemigrations
這邊報錯
raise improperlyconfigured(‘mysqlclient 1.3.13 or newer is required; you have %s.’ % database._version_)
然後在D:\Python\Webprojects\l_env\Lib\site-packages\django\db\backends\mysql目錄下找到base.py文件,然後將下面代碼註釋
#if version < (1, 3, 3):
# raise ImproperlyConfigured("mysqlclient 1.3.3 or newer is required; you have %s" % Database.__version__)
然後繼續嘗試又報錯
File “%s\django\db\backends\mysql\operations.py”, line 146, in last_executed_query
query = query.decode(errors=‘replace’)
在同樣的目錄下,找到\operations.py文件,
註釋下面2行代碼
#if query is not none:
# query = query.decode(errors='replace')
6、遷移數據庫,創建新表
python manage.py migrate
報錯raise MigrationSchemaMissing("Unable to create the django_migrations table (%s)" % exc
原因:
Django2.1不再支持MySQL5.5,必須5.6版本以上
查mysql版本和Django版本:
: show version()
:import django
解決辦法
二選一
(1)Django降級到2.0
pip install Django==2.0.0 -i https://pypi.douban.com/simple
(2)MySQL升級
參考:http://www.cnblogs.com/yebaofang/p/9863678.html
1.53、瞭解Django數據API
這裏所有的命令都是在Django的交互命令行中執行。
在項目根目錄下,啓用交互命令行
python manage.py shell
導入數據模塊
from app1.models import Person, Order # 導入Person, Order模塊
創建數據方法1
p = Person(first_name="hugo",last_name="張")
p.save() # 必須調用save()才能寫入數據庫
方法2
p = Person.objects.create(first_name="hugo",last_name="張")
查詢數據方法
Person.objects.all() # 查詢所有數據
Person.objects.get(first_name="hugo") # 查詢單個數據,get方法只能返回一個確定值
查詢指定條件的數據
Person.objects.filter(first_name__exact="hugo") # 指定first_name字段值必須爲hugo
Person.objects.filter(first_name__iexact="hugo") # 不區分大小寫
Person.objects.filter(id_get=1) # 查找所有id值大於1
Person.objects.filter(id_lt=100) # 查找所有id值小於100
# 排除所有創建時間大於現在的時間的,exclude的用法與filter正好相反
Person.objects.exclude(created_at__gt=datetime.datetime.now(tz=datetime.timezone.utc))
# 過濾出所有first_name中包含h的字段,然後將查詢結果按照id進行排序
Person.objects.filter(first_name__contains="h").order_by('id')
# 查詢所有first_name中不包含h的字段
Person.objects.filter(first_name__icontains="h").order_by('id')
修改數據前需要先查詢數據
p = Person.objects.get(first_name="hugo")
然後開始修改數據
p.first_name = "john"
p.last_name = "wang"
p.save()
或者
p, is_created = Person.objects.get_or_create(
first_name = "hugo",
defaults={"last_name":"wr"}
)
刪除數據同樣需要先找到對應的數據,然後進行刪除
Person.objects.get(id=1).delete()
(1,({'app1.Person':1}))
一般情況我們不會直接刪除數據,而是在數據模型定義的時候加個status參數,值爲True或者False,用來標記是否可用,True爲可用
1.6、路由(urls)
1.61、Django的URL路由流程如下
1、Django查找全局urlpaterns變量(urls.py)
2、按先後順序對URL逐一匹配urlpaterns每個元素
3、匹配到第一個時停止查找,然後執行對應的處理函數
4、如果沒有匹配到或出現異常,則由Django進行錯誤處理
1.62、Django支持的3種表達格式
1、精確字符串格式,如articles/1/。
一個精確URL匹配一個操作函數;最簡單的形式,適合對靜態URL的響應;URL字符串以“/”結尾,而不是開頭。
2、Django的轉化格式:<類型:變量名>,如articles/<int:year>/
Django轉化後的格式是一個URL的模板,匹配URL的同時在其中獲得一批變量作爲參數是一種常用的形式。目的是通過URL進行參數的獲取和匹配
格式轉化類型說明表
格式轉化類型 | 說明 |
---|---|
str | 匹配除分隔符(“/”)外的非空字符,默認類型<year> 等價於<str.year> |
int | 匹配0和正整數 |
slug | 匹配字母、數字、橫杆、下劃線組成的字符串,str子集 |
uuid | 匹配格式化的UUID(UUID,通用唯一識別碼,是由一組32位數的16進制數字所構成,可以產生一個號稱全球唯一的ID,可以用來命名文件、變量以及數據庫的ID主鍵等屬於唯一的元素。) |
path | 匹配任何非空字符串,包括路徑分隔符,是全集 |
1.63、Django支持正則表達式格式
這種情況下,前面必須是re_path函數,表達式必須是str格式,有2種使用形式
1、不提取參數:如“re_path(articles/([0-9]{4})/)”
,表示4位數字,每一位都是0到9的任意數字
2、提取參數:命名格式爲“(?p<name>pattern)”
,如“re_path(articles/(?p<year>)[0-9]{4}/)”
,將正則表達式提取的4爲數字,每一位都是0-9的任意數字,命名爲year。
未完待續。。。。。。
1.7、表單(forms)
在app1的文件下創建forms.py文件,添加下面代碼
from app1 import views as app1_views
from django.urls import path, include
urlpatterns = [
path('get_name', app1_views.get_name)
]
在views.py中編寫
from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from app1.forms import PersonForm
# Create your views here.
def get_name(request):
# 判斷請求方法是否爲POST
if request.method == 'POST':
# 將請求數據填充到PersonForm實例中
form = PersonForm(request.POST)
# 判斷form是否爲有效的表單
if form.is_valid():
# s使用form.cleaned_data獲取請求數據
first_name = form.cleaned_data_data['first_name']
last_name = form.cleaned_data_data['last_name']
# 響應拼接後的字符串
return HttpResponse(first_name + '' + last_name)
else:
return HttpResponseRedirect('/error/')
# 請求GET方法
else:
return render(request, 'name.html', {'from': PersonForm})
把URl添加到按app1/urls.py中
path('get_name', app1_views.get_name)
在demo/urls.py中添加
path('app1/',include('app1.urls'))