Django框架css
Python的WEB框架有Django、Tornado、Flask 等多種,Django相較與其餘WEB框架其優點爲:大而全,框架自己集成了ORM、模型綁定、模板引擎、緩存、Session等諸多功能。html
1、django的安裝實現和目錄介紹前端
django
#安裝: pip3 install django
添加環境變量
#1 建立project
django-admin startproject mysite
---mysite
---settings.py
---url.py
---wsgi.py
---- manage.py(啓動文件)
#2 建立APP
python mannage.py startapp app01
#3 settings配置
TEMPLATES
STATICFILES_DIRS=(
os.path.join(BASE_DIR,"statics"),
)
STATIC_URL = '/static/'
# 咱們只能用 STATIC_URL,但STATIC_URL會按着你的STATICFILES_DIRS去找#4 根據需求設計代碼
url.py
view.py
#5 使用模版
render(req,"index.html")
#6 啓動項目
python manage.py runserver 127.0.0.1:8090
#7 鏈接數據庫,操做數據
model.py
2.django的目錄介紹python
以下圖:shell
目錄介紹以下:數據庫
day70:
- app01
- admin Django自帶後臺管理相關配置
- modal 寫類,根據類建立數據庫表
- test 單元測試
- views 業務處理
- app02
- app03
day70
settings.py ---- 包含了項目的默認設置,包括數據庫信息,調試標誌以及其餘一些工做的變量。
urls.py ----- 負責把URL模式映射到應用程序。
manage.py ----- Django項目裏面的工具,經過它能夠調用django shell和數據庫等。
2、django的基本配置django
Django的配置文件(settings)瀏覽器
在settings文件內,有幾處須要注意,分別是:緩存
一、服務器
二、模版
三、數據庫
四、靜態文件
3、路由系統:
一、單一路由對應(即一個url對應一個函數)
二、基於正則的路由
三、添加額外的參數
四、路由的分發
示例以下:
# =======關於路由系統======
url(r'^index/', views.index),# 一、靜態路由:一個url對應一個函數,url(r'^index/', views.index)對應一個函數=====> def index
url(r'^edit/(\w+)/', views.edit),#2.動態路由:匹配正則url(r'^edit/(\w+)/', views.edit)====> def edit(request, a1),al表明url後面的正則
# 三、按照關鍵字傳url(r'^add_user / (?P < a1 >\d +) /', ====> def add_user(request, a1)
# 注:終止符:^ edit$
# 僞靜態:url(r'^edit/(\w+).html$', views.edit),
url(r'^app01/', include('app01.urls')),
# 四、路由分發:a.在當前url下導入include,在寫url(r'^app01/', include('app01.urls')
# b.再在app01的包下面建一個urls.py文件,寫入如下內容:
# from django.conf.urls import url
# from app01 import views
# urlpatterns=[
# url(r'^index.html$', views.index),
# ]
# c.在瀏覽器輸入網址http://127.0.0.1:8000/app01/index.html便可讀取index.html的內容
其url所對應的函數分別是:
def index(request):
user_list=[
"xuyuanyuan",
"bob",
"slina"
]
return render(request,"index.html",{"user_list":user_list})
def edit(request,x):
print(x)
return HttpResponse("hello")
def add_user(request,a1):
from django.urls import reverse
v=reverse("xyy",a1)
return HttpResponse("ok")
django中的路由系統和其餘語言的框架有所不一樣,在django中每個請求的url都要有一條路由映射,這樣才能將請求交給對一個的view中的函數去處理。其餘大部分的Web框架則是對一類的url請求作一條路由映射,從而是路由系統變得簡潔。
http請求中產生兩個核心對象:
http請求:HttpRequest對象
http響應:HttpResponse對象
所在位置:django.http
以前咱們用到的參數request就是HttpRequest 檢測方法:isinstance(request,HttpRequest)
# path: 請求頁面的全路徑,不包括域名
#
# method: 請求中使用的HTTP方法的字符串表示。全大寫表示。例如
#
# if req.method=="GET":
#
# do_something()
#
# elseif req.method=="POST":
#
# do_something_else()
#
# GET: 包含全部HTTP GET參數的類字典對象
#
# POST: 包含全部HTTP POST參數的類字典對象
#
# 服務器收到空的POST請求的狀況也是可能發生的,也就是說,表單form經過
# HTTP POST方法提交請求,可是表單中可能沒有數據,所以不能使用
# if req.POST來判斷是否使用了HTTP POST 方法;應該使用 if req.method=="POST"
#
#
#
# COOKIES: 包含全部cookies的標準Python字典對象;keys和values都是字符串。
#
# FILES: 包含全部上傳文件的類字典對象;FILES中的每個Key都是<input type="file" name="" />標籤中 name屬性的值,FILES中的每個value同時也是一個標準的python字典對象,包含下面三個Keys:
#
# filename: 上傳文件名,用字符串表示
# content_type: 上傳文件的Content Type
# content: 上傳文件的原始內容
#
#
# user: 是一個django.contrib.auth.models.User對象,表明當前登錄的用戶。若是訪問用戶當前
# 沒有登錄,user將被初始化爲django.contrib.auth.models.AnonymousUser的實例。你
# 能夠經過user的is_authenticated()方法來辨別用戶是否登錄:
# if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware
# 時該屬性纔可用
#
# session: 惟一可讀寫的屬性,表明當前會話的字典對象;本身有激活Django中的session支持時該屬性纔可用。
#方法
get_full_path(), 好比:http://127.0.0.1:8000/index33/?name=123 ,req.get_full_path()獲得的結果就是/index33/?name=123
req.path:/index33
對於HttpRequest對象來講,是由django自動建立的,可是,HttpResponse對象就必須咱們本身建立。每一個view請求處理方法必須返回一個HttpResponse對象。
HttpResponse類在django.http.HttpResponse
在HttpResponse對象上擴展的經常使用方法:
頁面渲染: render()
頁面跳轉: redirect("路徑")
locals(): 能夠直接將函數中全部的變量傳給模板
示例:
例如在urls.py文件內有以下內容:
url(r'^teacher/',views.teacher),
url(r'^add_teacher/',views.add_teacher),
則在views.py文件內是:
def teacher(request):
# models.Teacher.objects.create(tname="alex")
# models.Teacher.objects.create(tname="egon")
# models.Teacher.objects.create(tname="wusir")
teacher_list=models.Teacher.objects.all()
return render(request,"teacher.html",{"teacher_list":teacher_list})
def add_teacher(request):
teacher_name=input("請輸入你要添加的老師名字:").strip()
models.Teacher.objects.create(tname=teacher_name)
return redirect("/teacher/")
總結:
關於render和redirect的區別是:
1 render的頁面須要模板語言渲染,須要的將數據庫的數據加載到html,那麼全部的這一部分
除了寫在teacher的視圖函數中
2 redirect: url直接跳轉到/teacher/
補充:
關於視圖函數內的CBV(基於類的)和FBV(基於函數)
一、FBV:(在views.py文件內定義的是一個個的函數)
示例:
def index(request):
user_list=[
"xuyuanyuan",
"bob",
"slina"
]
return render(request,"index.html",{"user_list":user_list})
二、CBV(在views.py文件內定義的是類)
示例(在views.py文件內定義的是類)
class Login(View):
"""
get 查
post 建立
put 更新
delete 刪除
"""
def get(self,request):
# return HttpResponse("login_get")
return render(request,"login.html")
def post(self,request):
print(request.POST.get("username"))
return HttpResponse("login_post")
5、Template ---模板
模板系統的組成:HTML代碼和邏輯控制代碼
邏輯控制代碼能夠理解是django模板語言
變量(使用雙大括號來引用變量):
語法:
{{var_name}} var_name 指變量名
模版語言
模板中也有本身的語言,該語言能夠實現數據展現
一、母板:(即模板的繼承)
常見的 Web 開發問題: 在整個網站中,如何減小共用頁面區域(好比站點導航)所引發的重複和冗餘代碼?
解決該問題的傳統作法是使用 服務器端的 includes ,你能夠在 HTML 頁面中使用該指令將一個網頁嵌入到另外一箇中。 事實上, Django 經過剛纔講述的 {% include %} 支持了這種方法。 可是用 Django 解決此類問題的首選方法是使用更加優雅的策略—— 模板繼承 。
本質上來講,模板繼承就是先構造一個基礎框架模板,然後在其子模板中對它所包含站點公用部分和定義塊進行重載。
若是子板不自定義塊,默認會繼承母板的全部內容(包括模板的css,js),若是子板要修改css或js文件,在相應地方加塊,就能夠了
示例:layout.html是母板,classes.html是子板(須要將classes.html內的內容填充至layout.html的框架內,則能夠按照以下圖所示使用)
注:
母板
{% block 自定義塊名%}
子板的塊
{% block 母板中相應設置的塊名 }
{% block %} 內容 {% endblock %}的標籤也是成對出現
二、include(導入小組件===>模板引入)
{% include %}該標籤容許在(模板中)包含其它的模板的內容。 標籤的參數是所要包含的模板名稱,能夠是一個變量,也能夠是用單/雙引號硬編碼的字符串。 每當在多個模板中出現相同的代碼時,就應該考慮是否要使用 {% include %} 來減小重複。
第一步:建一個common.html文件,寫入你們都須要使用的共同內容:
示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
<h3>你們都須要用的小組件</h3>
<div class="title">標題:{{ name }}</div>
<div class="content">內容:{{ name }}</div>
</div>
</body>
</html>
第二步:當有html文件須要使用這個小組件時
示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
{# 須要用的小組件:將其引入便可#}
{% include 'common.html' %}
<h1>用戶登陸</h1>
<form method="post" action="/login.html">
{% csrf_token %}
<div>
用戶名:<input type="text" name="uname">
</div>
<div>
密 碼:<input type="password" name="pwd"><br>
</div>
<input type="submit" value="登陸">{{ mag }}
</form>
{# 在這個也須要用小組件#}
{% include 'common.html' %}
</div>
{% include 'common.html' %}
</body>
</html>
三、模板自定義函數:
(1) simple_filter
最多兩個參數,方式: {{第一個參數|函數名稱:"第二個參數"}}
能夠作條件判斷
(2) simple_tag
無限制: {% 函數名 參數 參數%}
a、在app中建立templatetags模塊
b、建立任意 .py 文件,如:test.py
示例:
在test.py文件內寫入如下內容:
from django import template
register=template.Library()#register這個變量名是固定的,不可修改
@register.filter
def my_upper(value):
return value.upper()
@register.filter
def join(value,arg):
return value+arg
@register.filter
def my_bool(value):
return False
@register.simple_tag
def my_lower(value,a1,a2,a3):
return value + a1 + a2 + a3
#二者的區別:
# 一、使用@register.filter只能接受2個參數,而使用@register.simple_tag能夠接收無數個參數
# 二、二者在前端的調用取值不一樣:分別是: <h1>filter</h1>
# {{ name|my_upper }}
# {{ name|join:"hahah"}}
#
# <h1>simple_tag</h1>
# {% my_lower "xuyuanyuan" "a1" "a2" "a3" %}
# 三、使用@register.filter,當前前端使用時,能夠進行進行條件語句的if 內,而@register.simple_tag不能用於條件語句
c、在使用自定義simple_tag的html文件中導入以前建立的 test.py 文件名
{% load test %}
d、使用simple_tag(再創建一個test.html文件,在其內寫入:)
{% load test %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{# - simple_filter#}
{# - 最多兩個參數,方式: {{第一個參數|函數名稱:"第二個參數"}}#}
{# - 能夠作條件判斷#}
<h1>filter</h1>
{{ name|my_upper }}
{{ name|join:"hahah"}}
<h1>filter用於if語句示例</h1>
{% if name|my_bool %}
<h3>真的啊</h3>
{% else %}
<h3>假的啊</h3>
{% endif %}
{# - simple_tag#}
{# - 無限制: {% 函數名 參數 參數%}#}
<h1>simple_tag</h1>
{% my_lower "xuyuanyuan" "a1" "a2" "a3" %}
</body>
</html>
e、在settings中配置當前app,否則django沒法找到自定義的simple_tag
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01.apps.App01Config',#當前的app
'app02',
]
其執行結果是: