Django入門------基礎(1)

基礎

Django 是用 Python 寫的一個自由和開放源碼 web 應用程序框架。
web框架是一套組件,能幫助你更快、更容易地開發web站點。當你開始構建一個web站點時,你總須要一些類似的組件:處理用戶認證(註冊、登陸、登出)的方式、一個管理站點的面板、表單、上傳文件的方式,等等。
有不少人注意到web開發人員會面臨一些共同的問題,他們聯手建立了 web 框架(Django 是其中一個)來供人使用。框架的存在,你無需從新發明輪子就能創建新的站點。html

MVC及MTV設計模式

在目前基於Python語言的幾十個Web開發框架中,幾乎全部的全棧框架都強制或引導開發者使用MVC設計模式。所謂全棧框架,是指除了封裝網絡和線程操做,還提供HTTP、數據庫讀寫管理、HTML模板引擎等一系列功能的Web框架,好比Django、Tornado和Flask。python

MVC設計模式:

最先由Trygve Teenskaug在1978年提出,上世紀80年代是程序語言Smalltalk的一種內部架構。後來MVC被其餘領域借鑑,成爲了軟件工程中的一種軟件架構模式。MVC把Web框架分爲3個基礎部分:web

模型(Model):用於封裝與應用程序的業務邏輯相關的數據及對數據的處理方法,是Web應用程序中用於處理應用程序的數據邏輯的部分,Model只提供功能性的接口,經過這些接口能夠獲取Model的全部功能。白話說,這個模塊就是Web框架和數據庫的交互層。sql

視圖(View):負責數據的顯示和呈現,是對用戶的直接輸出。數據庫

控制器(Controller):負責從用戶端收集用戶的輸入,能夠當作提供View的反向功能。django

這三個部分互相獨立,但又相互聯繫,使得改進和升級界面及用戶交互流程,在Web開發過程任務分配時,不須要重寫業務邏輯及數據訪問代碼。設計模式

MVC在Python以外的語言中也有普遍應用,例如VC++的MFC,Java的Structs及Spring、C#的.NET開發框架,都很是有名。瀏覽器

MTV設計模式:

Django對傳統的MVC設計模式進行了修改,將視圖分紅View模塊和Template模塊兩部分,將動態的邏輯處理與靜態的頁面展示分離開。而Model採用了ORM技術,將關係型數據庫表抽象成面向對象的Python類,將表操做轉換成類操做,避免了複雜的SQL語句編寫。MTV和MVC本質上是同樣的。服務器

模型(Model):和MVC中的定義同樣網絡

模板(Template):將數據與HTML語言結合起來的引擎

視圖(View):負責實際的業務邏輯實現

Django的MTV模型組織可參考下圖所示:

image.png-75.4kB

一、安裝Django

pip3 install django

二、建立django工程

打開命令行,cd 到一個你想放置你代碼的目錄,而後運行如下命令:

django-admin startproject mysite

這行代碼將會在當前目錄下建立一個 mysite 目錄。mysite目錄只是你項目的名稱, Django 不關心它的名字,能夠將它重命名爲任何你喜歡的名字。

三、運行django

命令行中CD到你建立的工程中,我這裏是mysite目錄,輸入如下命令

python manage.py runserver

這樣建立的網站就開始運行了,django啓動默認端口爲8000,能夠用瀏覽器訪問:http://127.0.0.1:8000/,以下:

這樣說明django程序成功運行起來了。

四、Django工程目錄詳解

這些文件或目錄的做用:

(1)最外層的mysite/目錄: 是項目的容器, Django 不關心它的名字,能夠將它重命名其餘名字。
(2)manage.py: 一個讓你用各類方式管理 Django 項目的命令行工具。好比咱們以前用的python manage.py runserver命令。
(3)裏面一層的mysite/目錄:包含你的項目,它是一個純 Python 包。它的名字就是當你引用它內部任何東西時須要用到的 Python 包名。 好比 mysite.urls。
(4)mysite/__init__.py: 一個空文件,告訴 Python 這個目錄應該被認爲是一個 Python 包。
(5)mysite/settings.py:Django 項目的配置文件。後面會詳細說到。
(6)mysite/urls.py:Django 項目的 URL 路由系統,就像你網站的「目錄」。
(7)mysite/wsgi.py:做爲你的項目的運行在 WSGI 兼容的Web服務器上的入口。後面會詳細說到。
(8)db.sqlite3 是django默認使用的sqlite3數據庫文件。

 五、開始一個app

(1)咱們建立app目錄(用於寫整個web站點的某種功能),命令以下:

python manage.py startapp app01

(2)編寫視圖

在app01/views.py 中寫以下函數:

from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello, welcome to app01 index.")

(3)在mysite/urls.py中聲明一個路由

from django.conf.urls import url
from django.contrib import admin
from app01 import views            # 導入app01的視圖

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index', views.index),   # 註冊index 路由
]

須要作兩點:導入視圖,註冊路由。 而後咱們重啓服務,訪問http://127.0.0.1:8000/index/看看:

六、CBV和FBV

(1)function based view (FBV)。

像前文那樣在app01/views.py 中,寫一個函數,處理請求,並返回結果就叫function based view,簡稱FBV。咱們能夠寫的詳盡些:

 app01/views.py中:

from django.http import HttpResponse

def home(request):
    ret = None
    if request.method == "GET":
        ret = "Welcome to home."
    return HttpResponse(ret)

mysite/urls.py中:

from django.conf.urls import url
from django.contrib import admin
from app01 import views  # 導入app01的視圖

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^home', views.home),  # 註冊home 路由
]

重啓以後訪問:http://127.0.0.1:8000/home,以下:

注意:視圖函數中的request是django對http請求的封裝,其中request.method封裝了請求動做,包括GET,PUT,POST等。

(2)class based view (CBV)

用類代替視圖函數的方法就叫作CBV,寫法以下:

app01/views.py中:

from django.http import HttpResponse
from django.views import View  # 引入該類


# class based view
class MyHome(View):  # 繼承views類

    def get(self, request):  # get請求會用這個方法處理,若是是post請求再寫個post方法處理便可
        ret = "Welcome to my home"
        return HttpResponse(ret)

mysite/urls.py中:

from django.conf.urls import url
from app01 import views  # 導入app01的視圖

urlpatterns = [
    # 註冊myhome 路由, 方式是views.類名.as_view()
    url(r'^myhome', views.MyHome.as_view()),
]

啓服務以後,訪問:http://127.0.0.1:8000/myhome, 以下:

七、使用模板

(1)返回html字符串

前文演示了在視圖函數中直接返回一些字符串給用戶,用的是from django.http import HttpResponse中的HttpResponse對象。

還能夠用from django.shortcuts import HttpResponse 的HttpResponse是同樣的,咱們稍加改編一下返回的字符串,改爲帶有HTML標籤的字符串看看:

 view.py

from django.shortcuts import HttpResponse

def index(request):
    ret = "<h1>{}</h1>".format("Hello, welcome to app01 index.")
    return HttpResponse(ret)

urls.py

from django.conf.urls import url
from app01 import views  # 導入app01的視圖

urlpatterns = [
    url(r'^index', views.index),
]

重啓以後,訪問http://127.0.0.1:8000/index,以下:

可見,咱們的「<h1></h1>」 標籤是生效的,也就是說,若是咱們把一個HTML文件的內容讀取成一長串字符串的返回,那麼用戶就能看到一個完整的網頁了。

在Python中,每每把HTML文件統一放在templates目錄下。

(2)在項目根目錄mysite下新建templates文件夾

3)在django的配置文件mysite/settings.py中找到TEMPLATES這個變量,是一個大列表,在列表中的DIRS後面,配上'templates',便可;即'DIRS': ['templates', ],以下:

(4)接下來能夠在templates文件夾下建立一個HTML文件,如index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首頁</title>
</head>
<body>
    <h1>Welcome to mysite index..</h1>
    <a href="http://www.cnblogs.com/jinyuanliu/">博客鏈接</a>
</body>
</html>

(5)在app01/views.py中修改一下視圖函數index()

from django.shortcuts import render

def index(request):
    return render(request, "index.html", )

(6)重啓後,訪問http://127.0.0.1:8000/index

八、使用模板語言

(1)views.py 的index中能夠傳變量,以下

from django.shortcuts import render


def index(request):
    name = "liuyy"
    fruits = ["火龍果", "香蕉", "西瓜"]
    info = {
        "age": 26,
        "salary": 1000000,
    }
    return render(request, "index.html", {"name": name, "fruits": fruits, "user": info})

(2)傳參數以後能夠在模板index.html中使用這些參數

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首頁</title>
</head>
<body>
    <h1>Welcome to mysite index..</h1>
    <a href="http://www.cnblogs.com/jinyuanliu/">博客鏈接</a>
    <p>我是{{ name }}</p>
    <p>喜歡的水果有:</p>
    {% for item in fruits %}
        <p>水果{{ forloop.counter }}: {{ item }}</p>
    {% endfor %}
    {% if "age" not in user %}
        <p>沒有年齡</p>
    {% else %}
        <p> 年齡 {{ user.age }}</p>
    {% endif %}
    <p> 第二個水果 {{ fruits.1 }}</p>
    {% for k, v in user.items %}
        <p>{{ k }}: {{ v }}</p>
    {% endfor %}

</body>
</html>

重啓以後,訪問http://127.0.0.1:8000/index,以下:

總結一下模板語言格式:

# 單個變量{{ name }}    
 
# if else 語句
{% if 條件 %}
    dosth..
{% else %}
    dosth..
{% endif %}
 
# 遍歷item_list
{% for item in item_list %} 
    <p>{{ item }}</p> 
{% endfor %}
 
# 表示第幾回循環(從1開始): {{ forloop.counter }}
# 若是是第一次循環{{ forloop.first }}爲True, 不然爲 False
# 若是是最後一次循環 {{ forloop.last }} 爲True, 不然爲False
 
# 遍歷字典dic
{% for k, v in user.items %}
    <p>{{ k }}: {{ v }}</p>
{% endfor %}
 
# 列表li中的第i個元素:  {{ li.i }}
# 字典dic中k對應的值: {{ dic.k }}
  
# 使用繼承模板:
# 母板base.html:{% block title %}  {% endblock %}
# 子板:{% extends "base.html" %}
     {% block title %}  {% endblock %}
 
# 幫助方法:
{{ item.timetype|date:"Y-m-d H:i:s"}}
{{ bio|truncatewords:"30" }}
{{ my_list|first|upper }}
{{ name|lower }}

九、自定義simple_tag

(1)在app01目錄下建立templatetags目錄

(2)在templatetags目錄下新建任意py文件, 如tag1.py

 

from django import template
from django.utils.safestring import mark_safe

register = template.Library()


@register.simple_tag
def tag_add_3_no(v1, v2, v3):
    return v1 + v2 + v3


@register.simple_tag
def my_input(name):
    result = "<h1> %s </h1>" % name
    # mark_safe 會讓html標籤合法
    return mark_safe(result)

其中的兩個函數就是本身自定義的函數,想怎麼寫怎麼寫。

(3) 哪一個html文件須要引用自定義的simple_tag,須要在html中導入以前建立的py文件

{% load tag1 %}

(4)在html模板中使用simple_tag

{% tag_add_3_no 1 2 3%}
{% my_input '個人simpletag'%} 

即{%  函數名  參數1  參數2%}

(5)關鍵一步:在settings.py中配置app

找到settings中的INSTALLED_APPS,註冊app01,以下:

若是不註冊的話,django沒法找到自定義的simple_tag。

 (6)完整配置

views.py

from django.shortcuts import render


def index(request):
    return render(request, "index.html")

urls.py

from django.conf.urls import url
from app01 import views  # 導入app01的視圖

urlpatterns = [
    url(r'^index', views.index),
]

index.py

{% load tag1 %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首頁</title>
</head>
<body>
  {% tag_add_3_no 1 2 3%}
  {% my_input '個人simpletag'%} 

</body>
</html>

tag1.py

from django import template
from django.utils.safestring import mark_safe

register = template.Library()


@register.simple_tag
def tag_add_3_no(v1, v2, v3):
    return v1 + v2 + v3


@register.simple_tag
def my_input(name):
    result = "<h1> %s </h1>" % name
    # mark_safe 會讓html標籤合法
    return mark_safe(result)
相關文章
相關標籤/搜索