Django框架<一>

Django框架css

Python的WEB框架有Django、Tornado、Flask 等多種,Django相較與其餘WEB框架其優點爲:大而全,框架自己集成了ORM、模型綁定、模板引擎、緩存、Session等諸多功能。html

1、django的安裝實現和目錄介紹前端

一、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請求作一條路由映射,從而是路由系統變得簡潔。

 

四 Django Views(視圖函數)

http請求中產生兩個核心對象:

        http請求:HttpRequest對象

        http響應:HttpResponse對象

所在位置:django.http

以前咱們用到的參數request就是HttpRequest    檢測方法:isinstance(request,HttpRequest)

1 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

2 HttpResponse對象:

  對於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模板語言

django的模板語言組成

  1. 變量(使用雙大括號來引用變量):

  2. 標籤(tag)的使用(使用大括號和百分比的組合來表示使用tag)
  3. 模板繼承

模板語言之變量

語法:

{{var_name}}   var_name 指變量名

模版語言

 模板中也有本身的語言,該語言能夠實現數據展現

    • {{ item }}
    • {% for item in item_list %}  <a>{{ item }}</a>  {% endfor %}
        forloop.counter
        forloop.first
        forloop.last 
    • {% if ordered_warranty %}  {% else %} {% endif %}
    • 母板:{% block title %}{% endblock %}
      子板:{% extends "base.html" %}
         {% block title %}{% endblock %}
    • 幫助方法:
      {{ item.event_start|date:"Y-m-d H:i:s"}}
      {{ bio|truncatewords:"30" }}
      {{ my_list|first|upper }}
      {{ name|lower }}

模板引入和繼承

一、母板:(即模板的繼承)

常見的 Web 開發問題: 在整個網站中,如何減小共用頁面區域(好比站點導航)所引發的重複和冗餘代碼?

解決該問題的傳統作法是使用 服務器端的 includes ,你能夠在 HTML 頁面中使用該指令將一個網頁嵌入到另外一箇中。 事實上, Django 經過剛纔講述的 {% include %} 支持了這種方法。 可是用 Django 解決此類問題的首選方法是使用更加優雅的策略—— 模板繼承 。

本質上來講,模板繼承就是先構造一個基礎框架模板,然後在其子模板中對它所包含站點公用部分和定義塊進行重載。

若是子板不自定義塊,默認會繼承母板的全部內容(包括模板的css,js),若是子板要修改css或js文件,在相應地方加塊,就能夠了

示例:layout.html是母板,classes.html是子板(須要將classes.html內的內容填充至layout.html的框架內,則能夠按照以下圖所示使用)

注:

母板

{% block 自定義塊名%}   

子板的塊

{% block 母板中相應設置的塊名 }

{% block %}  內容 {% endblock %}的標籤也是成對出現

使用繼承的注意事項:

  1. 建立 base.html 模板,在其中定義站點的主要外觀感覺。 這些都是不常修改甚至從不修改的部分。
  2. 爲網站的每一個區域建立 base_SECTION.html 模板(例如, base_photos.html 和 base_forum.html )。這些模板對base.html 進行拓展,幷包含區域特定的風格與設計。
  3. 爲每種類型的頁面建立獨立的模板,例如論壇頁面或者圖片庫。 這些模板拓展相應的區域模板。

 

模板繼承的一些訣竅:

    1. 若是在模板中使用 {% extends %} ,必須保證其爲模板中的第一個模板標記。 不然,模板繼承將不起做用。
    2. 通常來講,基礎模板中的 {% block %} 標籤越多越好。 記住,子模板沒必要定義父模板中全部的代碼塊,所以你能夠用合理的缺省值對一些代碼塊進行填充,而後只對子模板所需的代碼塊進行(重)定義。 俗話說,鉤子越多越好。
    3. 若是發覺本身在多個模板之間拷貝代碼,你應該考慮將該代碼段放置到父模板的某個 {% block %} 中。若是你須要訪問父模板中的塊的內容,使用 {{ block.super }}這個標籤吧,這一個魔法變量將會表現出父模板中的內容。 若是隻想在上級代碼塊基礎上添加內容,而不是所有重載,該變量就顯得很是有用了。
    4. 不容許在同一個模板中定義多個同名的 {% block %} 。 存在這樣的限制是由於block 標籤的工做方式是雙向的。也就是說,block 標籤不只挖了一個要填的坑,也定義了在父模板中這個坑所填充的內容。若是模板中出現了兩個相同名稱的 {% block %} 標籤,父模板將無從得知要使用哪一個塊的內容。

 

 

二、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',
]

 

其執行結果是:

相關文章
相關標籤/搜索