web框架之Django基礎
1. Django的簡介
Django是一個由python寫成的開放源代碼的Web應用框架,
Django的目的是使常見的Web開發任務,快速和容易,
2. Django框架的特點
1. 遵循MVC開發模式
2. 內置進行快速web開發所需的各種組件
3. 利用ORM(物件關系映射)機制來定義和資料庫,使開發人員可以構建出獨立于具體資料庫引擎的web應用
4. 內置后臺管理web應用
5. 內置web Server,開發人員無需安裝任何web Server就可以進行各種web應用的開發和測驗
6. 具有靈活而強大的自定義url系統
7. 內置多語種支持,可以方便地構建多國語言的web應用
MVC設計模式
Django是一種遵循MVC開發模式的框架.
models.py檔案中定義各種類代表的資料模型(Model)和資料庫引擎互動,執行資料庫資料的存取操作.
templates檔案夾中的各個模板檔案代表視圖(View),負責資料內容的顯示
urls.py中定義了各種url訪問入口和views.py中定義的各種處理函式(也稱為Django視圖函式),可以根據用戶輸入的url請求,呼叫views.py中相應的函式,資料模型和視圖互動,回應用戶的請求.
如圖所示:

基于Django的web應用開發活動由于主要集中在models.py,templates檔案夾中的各模板檔案以及views.py之內,因此Django的開發模式通常也稱為MTV開發模式
3. 安裝
方式一,pip方式安裝
pip install Django
方式二,pycharm中在file選單中安裝
在pycharm中找開file-->settings-->Project-->Project Interpreter
方式三,到github克隆安裝
git clone https://github.com/django/django.git
4. 基本配置
4.1 常用的命令
在IDE中創建Django程式時,本質上都是自動執行上述命令
#查看Django版本
python -m django --version
#創建一個名為mysite的專案
django-admin startproject mysite
#Django專案環境終端
python manage.py shell
#創建應用程式,確保和manage.py是同一個目錄
python manage.py startapp polls
#啟動Django,埠使用Django默認的8000
python manage.py runserver
#啟動Django,埠為8800
python manage.py runserver 8800
#啟動Django,埠為8800,任意機器都可以訪問
python manage.py runserver 0.0.0.0:8800
#進行創建模型變化遷移
python manage.py makemigrations
#運行應用模型變化到資料庫
python manage.py migrate
#同步到資料庫
python manage.py syncdb
#清空資料庫(保留空表)
python manage.py flush
#admin創建管理員用戶
python manage.py createsuperuser
#修改用戶密碼
python manage.py changepassword username
Django會自動重新加載runserver,根據需要開發服務器自動重新加載python代碼為每個請求,
這樣開發人員不需要重新啟動服務器代碼更改生效,
4.2 Django程式基本目錄及作用:
mysite/ #專案容器,名稱根據需要自定義
manage.py #與該Django專案進行互動的命令列實用工具
mysite/ #實際的python專案
__init__.py #空檔案
setting.py #Django的專案組態檔
urls.py #路由分發,url中的path(路徑)與視圖函式的映射關系
wsgi.py #一個入口為WSGI兼容的WEB服務器
appname
models #與資料庫互動的檔案
views #存放視圖函式的
setting.py組態檔的說明
#匯入OS模塊
import os
#指定本專案的基本目錄為這個專案所在的容器的路徑
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = ')f9lt68ux%%98t872s8l#8i8w7(p8e&)m-yafln3%d%z2x!9st'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
#白名單
ALLOWED_HOSTS = []
# 程式定義檔案
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',]
# 中間件
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 = 'url_config.urls'
#模板,用來存放html檔案
TEMPLATES = [
{'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'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 = 'url_config.wsgi.application'
# Database
# 配置資料庫,Django默認使用sqlite資料庫,默認自帶sqlite資料庫驅動,
# 所使用的資料庫的引擎為django.db.backends,sqlite3
# 指定使用的資料庫的路徑
DATABASES = {'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),}}
# Password validation
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',},]
# Internationalization
#配置專案初始化時的一些引數
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# 指定靜態檔案夾,用來存放css,javascript,image等檔案
STATIC_URL = '/static/'
4.3 靜態檔案:
在setting里修改添加,用來存放CSS,javascript,image等檔案
首先,創建static檔案夾,然后修改setting.py組態檔
STATIC_URL='/static/' #相當于別名
#指定靜態檔案的目錄
STATIC_ROOT={
os.path.join(BASE_DIR,"app_01/static"),
}
想使用靜態檔案,必須在要創建的網頁檔案中寫入引入陳述句:
{% load staticfiles $} #寫在引入靜態檔案的網頁的第一行
{% static '檔案名' %} #寫在檔案當中
引入靜態檔案的步驟:
1.把所有的靜態檔案放到一個static檔案夾中
2.將static檔案夾放在應用檔案夾下
3.在setting組態檔中配置別名
STATIC_URL='/static/'
STATIC_ROOT=(
os.path.join(BASE_DIR,"應用名/static"),
)
4.在模板檔案的首行加上"{% load staticfiles %}"
5.在模板檔案中引入靜態檔案:
{% static static靜態檔案的路徑 %}
例如,在一個專案中,使用bootstrap的樣式,就必須這樣寫:
{% load staticfiles %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="https://www.cnblogs.com/yanadoude/p/{% static'bootstrap-3.3.7/css/bootstrap.css' %}">
<style type="text/css">
</style>
</head>
<body>
<div >
<div >
</div>
</div>
</body>
</html>
4.4 路由系統
URL配置就像Django所支撐網站的目錄,其本質是URL模式以及要為該URL模式呼叫的視圖函式之間的映射表
在Django中,每一個請求的URL都要有一條路由映射,這樣才能將請求交給對一個view中的函式去處理
格式:
urlpatterns=[
url(正則運算式,views視圖函式,引數,別名)
]
4.4.1 單一路由分配
#匹配名稱為inex的視圖
url(r"^index$",views.index),
4.4.2 基于正則的路由分配
#匹配以index/開頭,后接任意個數字的視圖
url(r'^index/(\d*)',views.index),
#匹配以index/開頭,后接任意長度的字母的視圖,并把正則運算式的分組匹配到的欄位資訊發送給客戶端
url(r"^index/(?P<name>\w*)/(?P<id>\d*)",views.index),
4.4.3 添加額外的引數
#匹配以manage/開頭,后接任意長度的字母的視圖,并把值為333的id資訊發送給客戶端
url(r'^manage/(?P<name>\w*)',views.manage,{'id':333}),
4.4.4 路由映射設定名稱
#匹配以home/開頭的視圖,并把別名設為h1
url(r'^home',views.home,name='h1'),
#匹配以index/開頭,后接數字的視圖,并把別名設定為h2
url(r'^index/(\d*)',views.index,name='h2'),
4.4.5 路由分發
如果映射URL太多,都寫在一個URLpatterns顯得繁瑣,可以使用路由分發功能
那就是在每個應用里面單獨建立urls,即路由分發器.每個應用的視圖都分別到各自的應用中找,避免因為一個應用的崩潰而影響整個專案.
url(r'^blog/',include('blog.urls')),
需要注意的是:
URL多傳一個引數,那views函式就必須要多接受一個引數
4.5 視圖層
對邏輯負責處理用戶的請求并回傳回應,回傳可以是HTML網頁,或者重定向,或者404錯誤,或者一個XML檔案,也可以是一個物件
在一個檔案中稱之為視圖views.py,放在專案或應用程式目錄
HTTP請求中產生兩個核心物件
HTTP請求:HttpRequest
HTTP回應:HttpResponse物件
4.5.1 HttpResponst物件
#從django.http模塊中匯入HttpResponse
from django.http import HttpResponse
#匯入datetime模塊
import datetime
def current_datetime(request):
now=datetime.datetime.now()#獲取系統當前時間
html="<html><body>現在時刻:%s.</body></html>" %now
return HttpResponse(html)
在這個(views.py)視圖中每一個函式稱作視圖函式,視圖函式都以一個HttpRequest物件為第一個引數,該引數通常命名為request
在上面的代碼中,得到的第一個引數是一個HttpRequest物件,通過request.***的方式
path #使用GET方法時,只會得到路徑
get_full_path() #使用GET方法時,會得到包括路徑和?,=等資訊的全路徑
method #得到客戶端請求網頁的HTTP方法,POST或者GET
GET #包含所有的HTTP的GET方法的類字典物件
POST #包含所有的HTTP的POST方法的類字典物件
COOKIES #包含cookies的字典物件,其鍵和值都是字串
FILES #通過表單上傳的檔案的類字典物件,其每個key都是input標簽中name屬性的值,其每一個value的值是一個標準的python字典物件
filename #表示上傳檔案的檔案名
content-type #表示上傳檔案的內容原型
content #表示上傳檔案的原始內容
META #一個包含所有有效的HTTP頭資訊的字典
content_length #所接收的資料的長度
content_type #所接收的資料的型別
query_string #接收的原始請求字串
remote_addr #客戶端的IP地址
remote_host #客戶端的主機名稱
server_name #服務端的主機名
server_port #服務端的埠號
http_accept_encoding
http_accept_language
http_host #客戶端發送的HOST頭資訊
http_referer #被指向的頁面
http_user_agent #客戶端使用的瀏覽器的資訊
http_x_bender #X_bender頭資訊
session #唯一可讀寫的類字典物件,表示與服務端的當前會話資訊
body #POST原始資料,用于對資料的復雜處理
has_key() #布林值,標識request.GET或request.POST是否包含指定的鍵
is_secure() #客戶端發出的請求是否安全
is_ajax()
user #是一個django.contrib.auth.models.User物件,代表當前登陸的用戶,如果當前訪問用戶沒有登陸,其值將被初始化為django.contrib.auth.models.AnonymousUser的實體,只有激活Django中的AuthenticationMideleware時,該屬性才可用
4.5.2 HttpRequest物件
HttpRequest物件由Django自動創建
HttpResponse由開發人員創建,每個view請求處理方法必須回傳一個HttpResponse物件
在HttpResponse物件上擴展的常用方法
4.5.2.1 render()
格式:
render(request,template_name,context=None,content_type=None,status=None,using=None)
引數說明:
template_name為模板的名字,是必要的引數
可選的引數:
context 開發人員可以添加一個字典資訊到模板中,用來提示用戶,默認是一個空字典
content_type MIME型別用于生成檔案
status 為回應狀態代碼,默認值為200
using
也可以使用render_to_response("網頁檔案")
結合給定的模板與一個給定的背景關系,回傳一個字典HttpResponse的渲染文本物件
例子:
from django.shortcuts import render
def index(request):
return render(request,'index.html',{'msg':'hello world'})
4.5.2.2 rdirect("路徑")
格式:
redirect(to,args,kwargs)
重定向方法,可以在符合某個條件的時候跳轉到另一個頁面,
例子:
from django.shortcuts import render, HttpResponse,redirect
def register(request_info):
if request_info.method == 'POST':
user = request_info.POST.get('user')
pwd = request_info.POST.get('pwd')
if user == 'hello' and pwd == 'world':
return redirect('/login/')
return HttpResponse('賬號或密碼錯誤')
return render(request_info,'register.html')
def login(request_info):
return render(request_info,'login.html')
4.5.2.3 locals() 把視圖函式中所有的變數傳給模板
例子:
def register(request):
a1="aaa"
a2="bbb"
a3="ccc"
a4="ddd"
return render(request,"index.html",locals())#一次性把a1,a2,a3,a4四個變數傳給模板
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/137697.html
標籤:Python
上一篇:Python 3.9 beta2 版本發布了,看看這 7 個新的 PEP 都是什么?
下一篇:Python--生成器
