Django02 - 入門2
一:django目錄介紹
- django001: 專案名 - app01: app名字 migrations: 資料庫變更相關記錄 admin.py: 後臺管理 apps.py: app的相關配置 models.py: 資料庫相關 tests.py: 測試相關 views.py: 檢視函式 - django001: 和專案名同名的目錄 settings.py: 配置檔案 urls.py: 總路由 wsgi.py: wsgi伺服器配置 - templates: 模板檔案(一堆HTML) - manage.py: 啟動專案、建立app、各種命令的操作
二:app介紹
app就是一個獨立的功能,一個包
1.建立app
python3 manage.py startapp app名字
2.作用
沒有app,完全可以(一般情況下,1個專案,至少有1個app)
多個app的作用:區分不同的功能(例如:淘寶有 使用者相關功能、商品相關功能、訂單相關功能,可以放在不同app中)
- 解耦合,把類似的功能寫到一起,組成一個app
3.建立第二個app
python3 manage.py startapp 第二個app名字
4.app的註冊
方式1:
'app01.apps.App01Config'
方式2:
'app01'
三:django的啟動方式
1.方式1 - PyCharm
點選執行
如果不行,就進行如下設定
2.manage.py
python3 manage.py runserver 127.0.0.1:8000
python3 manage.py runserver 8000 # 不指定IP地址,預設就是本地地址
python3 manage.py runserver 0.0.0.0:8000 # 外部網路亦可訪問
3.django的socket
在django中,預設情況下,使用的socket是wsgiref
,效能很低,僅用於測試
真正後期上線的時候,需要使用效能更高的web伺服器:uwsgi
瞭解:cgi, fastcgi, wsgi, uWSGI, uwsgi, wsgiref
四:配置檔案詳解
import os
# BASE_DIR:專案的根路徑
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# SECRET_KEY:金鑰,專案中預設的一些加密 會用到它(可以改,但不能刪)
SECRET_KEY = 'ov7178+j+$e4x$_vui@f1)o@ymm963-96^%6zh+spq-yy2ws@*'
# DEBUG:除錯模式,開發階段是True,上線階段是False。
# 如果設定成True的話,可以看到響應的提示和路徑,報錯資訊更完善。
DEBUG = True
# ALLOWED_HOSTS:上線階段使用,允許誰訪問,*表示全部
ALLOWED_HOSTS = []
# INSTALLED_APPS專案所有的app,是一個列表,新增的app就是在這裡註冊的
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01.apps.App01Config',
]
# MIDDLEWARE:中介軟體
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
# ROOT_URLCONF:根路由的檔案地址,位置是可以改變的
ROOT_URLCONF = 'django001.urls'
# TEMPLATES:模板檔案存放路徑
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')] # 重點看這裡,這個路徑是一個列表,django-admin建立的django專案,需要手動配置
,
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
# WSGI_APPLICATION:wsgi伺服器使用的是哪個
WSGI_APPLICATION = 'django001.wsgi.application'
# DATABASES:資料庫連線配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
# AUTH_PASSWORD_VALIDATORS:一些模組,內建模組、內建app相關
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# 國際化相關:語言和時區
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# STATIC_URL:靜態檔案配置相關
STATIC_URL = '/static/'
重點
1.資料庫
2.靜態檔案相關
3.根路由
4.模板檔案
5.是否是除錯模式
6.app是否註冊
五:路由簡單入門
路由:地址 與 檢視函式 的對映關係 —— uels.py
# urlpatterns列表:列表內放了url函式的執行結果
# 使用很簡單,複製一行,改一下第一個引數(帶有正則表示式的路徑)和第二個引數(對應的檢視函式記憶體地址)
urlpatterns = [
url(r'^admin/', admin.site.urls),
# 在內部,請求來了,路徑匹配成功,內部自動呼叫index(request),把request傳入
url(r'^index/', view.index),
]
六:檢視簡單入門
1.檢視函式:views.py
可以不放在views.py
中,但是通常放在裡面
2.請求物件
-
request.method —— get、post
-
request.GET —— 當做字典來用
-
request.POST —— post形式傳遞的引數
post請求可不可以在請求地址中攜帶資料?
可以
# request必須傳,約定俗稱都使用request
# request是一個物件,請求的物件。請求過來的是符合HTTP協議的資料包(字串)
# django把HTTP請求,拆分、封裝到看request物件中
# 拆HTTP:1.字串拆成字典(wsgiref做的)2.封裝到request物件中
# request物件中一定有檔次HTTP請求的所有東西:請求地址、請求方式、請求頭、請求體
def index(request):
# 1.請求方式(常用:GET、POST)瀏覽器位址列中發出的都是GET請求
print(request.method)
# 2.請求的引數:get請求是這種形式:http://127.0.0.1/index?name=Darker&age=18
print(request.GET) # 把它當成字典
# print(request.GET.get('name'))
print(request.GET['name']) # 可能會報錯,所以推薦用get取值
# print(request.GET.get('age'))
# 3.POST形式提交的資料(資料存放在請求體(body體)中)
print(request.POST) # 把它當成字典
return HttpResponse('OK')
3.響應物件
① HttpResponse(一個類):返回字串形式
return HttpResponse('<h1>Hello World</h1>')
② render(一個函式,返回HttpResponse
的物件):返回模板檔案
return render(request, 'index.html')
③ redirect(一個函式,返回HttpResponse
的物件):重定向
return redirect('/index')
return redirect('http://www.xuexianqi.top')
七:靜態檔案配置
靜態檔案:js
、css
、img
等
1.去settings.py
中配置
# 靜態檔案配置相關
STATIC_URL = '/static/'
# 再配一個 STATICFILES_DIRS=列表(列表內寫路徑)
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'), # 真實的靜態檔案路徑
)
2.新建一個static資料夾
在該資料夾下,新建:img
、css
、js
資料夾。
以後,在相應的目錄,放相應的程式碼。
3.在模板的HTML中使用
<script src='/static/jquery.js'></script>
4.靜態檔案的本質
STATIC_URL = '/static/'
其實就是開了一個隱藏的路由
八:簡單的登入功能
路由
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', views.login),
url(r'^$', views.login),
url(r'^index/', views.index),
]
檢視函式
def login(request):
if request.method == 'GET':
return render(request, 'login.html')
else:
username = request.POST.get('username')
password = request.POST.get('password')
# 建立資料庫連線
conn = pymysql.connect(
host='127.0.0.1',
user='root',
database='userinfo',
port=3306
)
# 拿到1個遊標
cursor = conn.cursor()
# 執行sql
cursor.execute('select * from user where username=%s and password=%s', (username, password))
# 獲取結果
ret = cursor.fetchone()
print(ret)
if ret:
# return redirect('/index')
return render(request, 'index.html')
else:
return HttpResponse('賬號或密碼錯誤!')
def index(request):
return render(request, 'index.html')
九:MTV與MVC
MVC架構 - 主流的web框架
Web伺服器開發領域裡著名的MVC模式,所謂MVC就是把Web應用分為模型(M),控制器(C)和檢視(V)三層,它們之間以一種外掛式的、鬆耦合的方式連線在一起,模型負責業務物件與資料庫的對映(ORM),檢視負責與使用者的互動(頁面),控制器接受使用者的輸入呼叫模型和檢視完成使用者的請求。
Web應用分為模型(M)、檢視(V)、控制器(C)
- M - Model:資料庫相關操作
- C - Controler:控制器,邏輯相關,邏輯程式碼
- V - View:檢視,模板檔案
MVT架構 - Django的框架
Django的MTV模式本質上和MVC是一樣的,也是為了各元件間保持鬆耦合關係,只是定義上有些許不同
- M - Model(模型):資料庫相關操作,負責業務物件和資料庫的關係對映(ORM)
- T - Template(模板):(就是MVC的V層)負責如何把頁面展示給使用者(html)
- V - View(檢視):(路由+V=MVC的控制器)負責業務邏輯,並在適當時候呼叫Model和Template
除了以上三層之外,還需要一個URL分發器,它的作用是將一個個URL的頁面請求分發給不同的View處理,View再呼叫相應的Model和Template,MTV的響應模式如下所示
一般是使用者通過瀏覽器向我們的伺服器發起一個請求(request),這個請求回去訪問檢視函式,(如果不涉及到資料呼叫,那麼這個時候檢視函式返回一個模板也就是一個網頁給使用者)。
檢視函式呼叫模型,模型去資料庫查詢資料,然後逐級返回,檢視函式把返回的資料填充到模板中空格中,最後返回網頁給使用者。
十:django請求生命週期
同步框架的併發量:峰值 - 300
0.近幾年Python中的幾個框架:Sanic、FastAPI(非同步框架)
1.Python中的web伺服器都符合wsgi協議
2.web伺服器
任何語言都會有一個web伺服器,負責把HTTP請求轉換成這門語言的變數
Python:wsgiref(效能很低)、uwsgi(C語言寫的),200多併發量
Java:Tomcat、jboss(300多併發量)
PHP:php伺服器
3.django生命週期
十一:虛擬環境講解,pycharm配置
1.虛擬環境的作用
隔離專案,每個專案有自己依賴的模組和包。不同的模組和包的版本就不會相互影響。
2.PyCharm中配置虛擬環境
十二:ORM概述
1.什麼是ORM?
Object Relational Mapping,簡稱ORM,是物件關係對映(和語言無關)
資料庫中的表 - 對應程式的一個類
資料庫中的一行資料 - 對用程式中的一個物件
2.Python中常見的ORM框架
Django的ORM框架
sqlachemy ORM框架
3.Java:(擴充套件),Java中寫web框架
ssh框架:spring + structs(有漏洞) + hibernate(ORM框架)
ssm框架:spring + springMVC + mybatis(ORM框架,可以寫原生sql)
springboot:sb框架(全家桶),內建了Tomcat
springcould:微服務
4.ORM可以做的事
- 建立表(但是不能建立資料庫,只能手動建立資料庫)
- 增加刪除表內欄位
- 增刪改查資料
十三:django中orm的使用
1.建立UserInfo表 - 在models.py
中寫一個類
2.表中有欄位(類屬性)
第一步:models中書寫類
from django.db import models
# 一定要繼承
class UserInfo(models.Model):
# 欄位屬性==》由後面的物件決定
# 該欄位自增,並且是主鍵
id = models.AutoField(primary_key=True)
# 該欄位是varchar型別,長度是32(唯一約束,是否是索引,預設值是什麼,是否可以為空)
name = models.CharField(max_length=32)
# 密碼欄位
password = models.CharField(max_length=64)
第二步:執行資料遷移命令
python3 manage.py makemigrations # 會在migrations資料夾下建立一條記錄
python3 manage.py migrate