創(chuàng)建工程
開始本章之前,大家可以先看看我的另一篇文章:Django基本流程
1、這里使用pycharm專業(yè)版進行django開發(fā),該開發(fā)工具確實很強大,愛不釋手。
2、創(chuàng)建工程:
如圖是創(chuàng)建好的工程,創(chuàng)建方式,如圖演示。
創(chuàng)建工程還可以通過django-admin命令進行,該命令解釋如下:
django-admin --help
在使用這個命令的時候,有一個奇怪現象:
(1)直接運行時:
這條記錄為:
Note that only Django core commands are listed as settings are not properly configured (error: Requested setting INSTALLED_APPS, but s
ettings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before
accessing settings.).
(2)縮放窗口后:
變成了兩條記錄!內容為:
Note that only Django core commands are listed as settings are not properly configured (error: Requested setting INSTALLED_APPS, but settings are not conf Note that only Django core commands are listed as settings are not properly configured (error: Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before
accessing settings.).
經過福爾摩斯本人的調查,上面是pycharm的一個bug,看似兩條記錄,經過對比,實際想說的事情,跟第一條是一樣的,所以這本質上是一條記錄。(我在測試方面,有時候覺得自己是個天才?。。。?/p>
我向來是追求完美的,不允許出現任何瑕疵,這個是pycharm本身的問題,我不處理了,但是拋出的這個Note,我得處理一下:
在settings文件里面,我又發(fā)現一個奇怪的問題:
“”"
Django settings for mylovedjango project.
Generated by ‘django-admin startproject’ using Django 3.1.
For more information on this file, see
https://docs.djangoproject.com/en/3.1/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.1/ref/settings/
“”"
創(chuàng)建使用了django,但文件本身有問題:
所以需要手動導入os模塊,并修改格式,使其能用,而且美觀。通過上面兩個小插曲,感覺這個django有點不靠譜。按理說django團隊,不應該這樣“馬大哈”呀!難道我下了一個假的django!不管了,先解決這個問題:
Note that only Django core commands are listed as settings are not properly configured (error: Requested setting INSTALLED_APPS, but s
ettings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before
accessing settings.).
查詢官方文檔了解情況:
https://docs.djangoproject.com/en/3.1/ref/django-admin/
主要意思為:如果通過pip安裝Django,那么Django管理腳本應該位于系統(tǒng)路徑上。如果不在您的路徑中,請確保您已經激活了虛擬環(huán)境。
我也不確定是否用pip安裝了Django,但激活虛擬環(huán)境,應該就可以解決該問題。好像不激活環(huán)境也能用,這里應該是提示你這個主意事項,后續(xù)遇到問題可以通過激活的方式解決。既然不影響,我當然選擇,忽略該問題啦!小問題,不值得我出手,哈哈!不過,win10激活環(huán)境的方式如下:
運行工程環(huán)境下的activate.bat就可以激活(pycharm創(chuàng)建環(huán)境時,應該已經自動激活)。
創(chuàng)建應用
如上,使用命令行工具創(chuàng)建應用,創(chuàng)建成功,命令如下:
django-admin startapp firstapp
1、注冊應用
工程目錄下的settings文件,在INSTALLED_APPS列表中添加’firstapp.apps.FirstappConfig’,:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'firstapp.apps.FirstappConfig',
]
如上,即可完成應用的注冊。注冊的目的,是說明該應用是合法的,至少在django的“應用商店”是合法的。
模型
每個應用都有一個模型文件models.py,用于定義數據字段。
# 查看官方文檔并進行配置:
# https://docs.djangoproject.com/en/3.1/ref/settings/#databases
DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': BASE_DIR / 'db.sqlite3',
# }
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'djangostudy',
'USER': 'root',
'PASSWORD': 'yeqinfang',
'HOST': '192.168.31.201',
'PORT': '3306',
}
}
運行之后報錯:
python manage.py runserver
根據提示,安裝該客戶端
官方文檔: https://pypi.org/project/mysqlclient/
pip install mysqlclient
運行之后即可連上數據庫(django自動導入了mysqlclient模塊):
根據提示,要使得django工作,得進行migrations:
python manage.py makemigrations
python manage.py migrate
運行之后:
如上,運行成功,說明替換mysql數據庫成功,生成表如下:
如上,表的名稱默認應用名稱加上類的名稱。
視圖
我們已經有了數據,那么這些數據如何展示出來呢?django是一個后臺,后臺的數據可以通過接口提供。所以,視圖就是用于接口的編寫的,包含了一些業(yè)務邏輯。
現在表里面沒有數據,我們在views.py里寫一些接口進行操作:
1、增
該接口用于新增數據。
from django.shortcuts import render
from django.http import JsonResponse
import json
from firstapp.models import testmysql
# Create your views here.
def add_data(request):
response = {} # 響應
if request.method == "POST":
req = json.loads(request.body)
else:
response["msg"] = "請求方法錯誤"
response["code"] = 400
return JsonResponse(response)
# 數據持久化(往數據庫寫入數據)
try:
data = testmysql()
data.student_name = req["studentName"]
data.course_name = req["courseName"]
data.save()
response['msg'] = 'success'
response['error_num'] = 0
except Exception as e:
response['msg'] = str(e)
response['error_num'] = 1
return JsonResponse(response)
如上是一個新增接口,設置好后,需要配置路由,否者請求不到改接口:
路由配置有三種方式,在urls模塊里面有提示:
“”"mylovedjango URL Configuration
The urlpatterns
list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/3.1/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path(’’, views.home, name=‘home’)
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path(’’, Home.as_view(), name=‘home’)
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path(‘blog/’, include(‘blog.urls’))
“”"
我們這里采用第三種方式,在應用里新增一個子路由(復制粘貼urls到應用里),并進行設置:
from django.urls import path
from firstapp.views import add_data
urlpatterns = [
path('firstapp/', add_data),
]
如上,導入接口add_data,然后配置路由,讓外部請求。
接著配置工程目錄的主路由:
from django.urls import path, include
urlpatterns = [
# path('admin/', admin.site.urls),
path('', include('firstapp.urls')),
]
接著,運行程序,并通過postman進行模擬請求:
如圖報錯,查看后臺日志為:
Forbidden (CSRF cookie not set.): /firstapp/
如上,報錯的原因是,我們配置了cookies的驗證,現在我們在設置文件里,把該選項注釋掉:
注釋掉后自動加載,再次請求看看:
如上,請求成功,數據寫入數據庫,至此,完成了新增數據接口。
2、查
有了數據之后,我們寫個查詢接口,專門查詢數據:
def query_data(request, pk):
response = {} # 響應
if request.method == "GET":
query_art = testmysql.objects.all()
for art in query_art:
if art.id == pk:
response["data"] = json.dumps({"id":art.id,
"studentName":art.student_name,
"courseName":art.course_name})
response["msg"] = "查詢成功"
response["code"] = 200
else:
response["msg"] = "沒有符合的數據"
response["code"] = 201
return JsonResponse(response)
else:
response["msg"] = "請求方法錯誤"
response["code"] = 400
return JsonResponse(response)
# 查詢數據
return JsonResponse(response)
如上,采用GET方法,傳入一個pk進行查詢,應用的子路由配置如下:
urlpatterns = [
path('firstapp/', add_data),
path('firstapp/<int:pk>/', query_data),
]
驗證結果:
如上,查詢成功。不過,后臺日志有個301的code:
301是重定向,表示當用戶或搜索引擎向網站服務器發(fā)出瀏覽請求時,服務器返回的HTTP數據流中頭信息(header)中的狀態(tài)碼的一種,表示本網頁永久性轉移到另一個地址。
這個應該是django的內部機制,暫時忽略。
3、改
現在我們寫一個接口,用于更改數據庫存在的信息:
def update_data(request, pk):
response = {} # 響應
if request.method == "PUT":
req = json.loads(request.body)
try:
art = testmysql.objects.get(id=pk)
art.student_name = req["studentName"]
art.course_name = req["courseName"]
art.save()
response["msg"] = "更新成功"
response["code"] = 200
return JsonResponse(response)
except:
response["msg"] = "數據不正確"
response["code"] = 401
return JsonResponse(response)
else:
response["msg"] = "請求方法錯誤"
response["code"] = 400
return JsonResponse(response)
子路由如下:
urlpatterns = [
path('firstapp/', add_data),
path('firstapp/<int:pk>/', query_data),
path('firstapp/update/<int:pk>/', update_data),
]
運行之后報錯:
查看后臺,發(fā)現是django默認配置導致的。這里說的是路由請求的路徑存在問題,解決的辦法應該有3種:
1、修改子路由
2、請求的時候完全匹配路徑
3、修改django配置
這里采用第二種:
如上,請求成功。
4、刪
定義一個刪除接口,用于刪除數據。
在views.py文件定義一個刪除接口:
def delete_data(request, pk):
response = {}
if request.method == "DELETE":
try:
art = testmysql.objects.get(id=pk)
art.delete()
response["msg"] = "刪除成功"
response["code"] = 200
return JsonResponse(response)
except:
return JsonResponse({"code": "500", "msg": "刪除失敗"})
添加子路由:
urlpatterns = [
path('firstapp/', add_data),
path('firstapp/<int:pk>/', query_data),
path('firstapp/update/<int:pk>/', update_data),
path('firstapp/delete/<int:pk>/', delete_data),
]
如上,數據已被刪除。
模板
該模塊定義了前端的展示界面,創(chuàng)建django工程時,專門生成了一個文件夾,這里放的就是前端代碼。
當然,django有自帶的模板語法,即HTML代碼+python語言。
現在,我們編寫Template將數據庫的字段進行展示。
當我們使用了Template,就不再是前后端分離模型了,而是django的MVT模型,views視圖返回的,不再是json格式數據,而是html頁面。
1、修改query_data,需要使用render返回頁面
def query_data(request, pk):
response = {} # 響應
if request.method == "GET":
query_art = testmysql.objects.all()
for art in query_art:
if art.id == pk:
response["data"] = json.dumps({"id":art.id,
"studentName":art.student_name,
"courseName":art.course_name})
response["msg"] = "查詢成功"
response["code"] = 200
else:
response["msg"] = "沒有符合的數據"
response["code"] = 201
# return JsonResponse(response)
return render(request, "firstappweb.html", response)
else:
response["msg"] = "請求方法錯誤"
response["code"] = 400
# return JsonResponse(response)
return render(request, "firstappweb.html", response)
# 查詢數據
# return JsonResponse(response)
return render(request, "firstappweb.html", response)
2、如上,返回的firstappweb.html放在templates文件夾下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>data for test</title>
</head>
<body>
<h1>{{ msg }}</h1>
<h1>{{ code }}</h1>
<h1>{{ data }}</h1>
</body>
</html>
輸入地址訪問:
如上,數據通過Templates顯示在了頁面上。
這就是django的MVT模型。
使用體驗
通過上面的操作,我們發(fā)現django在web開發(fā)上,確實很簡單!java目前是主流的web開發(fā)語言,而django也很難取代他的霸主地位。不過,豆瓣便是django的成功案例。所以,雖然django前途不太樂觀,但也是可以讓你快速成功的框架。
Django讓web開發(fā)更簡單!