web框架之Django基礎

  1. Django的簡介

Django是一個由python寫成的開放源代碼的Web應用框架。

Django的目的是使常見的Web開發任務,快速和容易。

  1. Django框架的特點

  2. 遵循MVC開發模式

  3. 內置進行快速web開發所需的各種組件

  4. 利用ORM(對象關係映射)機制來定義和數據庫,使開發人員可以構建出獨立於具體數據庫引擎的web應用

  5. 內置後臺管理web應用

  6. 內置web Server,開發人員無需安裝任何web Server就可以進行各種web應用的開發和測試

  7. 具有靈活而強大的自定義url系統

  8. 內置多語種支持,可以方便地構建多國語言的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開發模式

  1. 安裝

方式一,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 %}

Title
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\w*)/(?P\d*)",views.index),
4.4.3 添加額外的參數

#匹配以manage/開頭,後接任意長度的字母的視圖,並把值爲333的id信息發送給客戶端
url(r’^manage/(?P\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=“現在時刻:%s.” %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四個變量傳給模板
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章