者 | 單雨
責編 | 胡巍巍
出品 | CSDN(ID:CSDNnews)
前言
為了實現(xiàn)模板封裝和復(fù)用,提高HTML界面調(diào)試便捷性以及前后端解耦等目標,Django定義了自己的網(wǎng)絡(luò)模板語言。
當前介紹模板語言的官方文檔已經(jīng)非常完備,幾乎涵蓋了開發(fā)中需要用到的知識點和需要注意的問題,但同時官方文檔也存在一些問題:
翻譯不夠完善,帶來閱讀的困難;
一些知識點的介紹過于簡短,存在大量的頁內(nèi)鏈接,閱讀時需要跳轉(zhuǎn)到不同的頁面,閱讀不連貫。
本文基于官方文檔系統(tǒng)介紹了Django模板語言的基礎(chǔ)知識點,方便快速了解Django模板語言。
模板系統(tǒng)設(shè)計哲學(xué)
Django的模板系統(tǒng)不是簡單的把Python嵌入到HTML中。
它的設(shè)計宗旨是:模板系統(tǒng)旨在展示內(nèi)容, 而不是程序邏輯,因此不在HTML頁面中嵌入Python。
簡單的說,模板只負責渲染數(shù)據(jù),大多數(shù)邏輯應(yīng)該交給視圖(view)進行處理。
模板簡介
模板是一個簡單的文本文件。它可以生成任何基于文本的格式(如 HTML,XML,CSV等)。除了基本的HTML標簽外,模板還包含兩種額外的元素——變量和標簽。
模板中包含的變量可以被替換為變量的值,標簽則被替換為相應(yīng)的模板控制邏輯。示例:
django
{% extends "base_generic.html" %}
{% block title %}{{ section.title }}{% endblock %}
{% block content %}
<h1>{{ section.title }}</h1>
{% for story in story_list %}
<h2>
<a href="{{ story.get_absolute_url }}">
{{ story.headline|upper }}
</a>
</h2>
<p>{{ story.tease|truncatewords:"100" }}</p>
{% endfor %}
{% endblock %}
`{{ section.title }}`在模板渲染時將會被變量的值替換,for標簽可以實現(xiàn)模板的循環(huán)渲染。
基礎(chǔ)語法
變量
變量實現(xiàn)從模板上下文字典(返回HTTP響應(yīng)時傳遞過來的字典)中輸出一個值,這是一個類似于dict的對象,包含鍵值對。當模板引擎遇到一個變量時,它會計算該變量,并用結(jié)果替換它。
變量名由字母、數(shù)字字符和下劃線("_")組成,但不能以下劃線開頭。點(".")也出現(xiàn)在變量中,代表屬性調(diào)用,變量名中不能有空格或標點符號。
示例:
django
My first name is {{ first_name }}. My last name is {{ last_name }}.
當傳入一個上下文字典`{'first_name': 'John', 'last_name': 'Doe'}`時,將會渲染得到:
django
My first name is John. My last name is Doe.
模板中的變量被字典中的值替換了。
變量還可以使用點表示法實現(xiàn)字典查找、屬性查找和列表索引查找等操作:
django
{{ my_dict.key }}
{{ my_object.attribute }}
{{ my_list.0 }}
點表示法底層原理
當模板系統(tǒng)遇到一個點,它會按順序嘗試下面的動作:
1. 字典查詢
2. 屬性或方法查找
3. 數(shù)字索引查詢
如果結(jié)果值是可調(diào)用的,則調(diào)用該值時將不帶參數(shù),調(diào)用的結(jié)果成為新的模板值。
當進行能覆蓋字典查找的操作時,這種查找順序可能會造成一些意想不到的行為。例如:如果試圖循環(huán)一個collection .defaultdict字典對象:
django
{% for k, v in defaultdict.items %}
{其他操作}
{% endfor %}
因為字典查找是首先發(fā)生的,所以這個行為會先提供一個默認值,而不是使用預(yù)期的.items方法。在這種情況下,應(yīng)該首先考慮使用字典查找,而不是使用字典的屬性調(diào)用。
注意
屬性通常被解釋為一個文本字符串,防止和同名的變量沖突。例如{{foo.bar}}中的屬性“bar”將被解釋為一個文本字符串,如果模板上下文中存在變量“bar”,則不會使用該變量的值。
以下劃線開頭的變量屬性可能不能訪問,因為它們通常被認為是私有的。
如果引用不存在的變量,模板系統(tǒng)將插入string_if_invalid選項的值,該選項默認設(shè)置為“”(空字符串)。
標簽
標簽在模板渲染過程中提供任意邏輯。標簽可以輸出內(nèi)容,作為控制結(jié)構(gòu),例如“if”語句或“for”循環(huán),從數(shù)據(jù)庫獲取內(nèi)容,甚至允許訪問其他模板標簽。
(1)標簽聲明
標簽的一般形式為:
django
{% tag %}
示例:
django
{% csrf_token %}
(2)傳入?yún)?shù)
django
{% cycle 'odd' 'even' %}
(3)成對使用的標簽
有些標簽需要開始和結(jié)束標簽:
django
{% if user.is_authenticated %}Hello, {{ user.username }}.{% endif %}
(4)常用標簽
for:循環(huán)數(shù)組中的每個元素. 比如, 顯示列表 `athlete_list` 中每個元素的 `name` 屬性。
django
<ul>
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% endfor %}
</ul>
if 、elif和else:在上面,如果athlete_list不為空,則{{athlete_list|length}}變量將顯示運動員的數(shù)量。
否則,如果athlete_in_locker_room_list不為空,則會顯示“Athletes should be out…”消息。如果兩個列表都為空,則顯示“No athletes”。
也可以在if標簽里使用過濾器和各種操作符:
django
{% if athlete_list|length > 1 %}
Team: {% for athlete in athlete_list %} ... {% endfor %}
{% else %}
Athlete: {{ athlete_list.0.name }}
{% endif %}
注意
雖然上面的示例可以工作,但是要注意,大多數(shù)模板過濾器都返回字符串,因此使用過濾器進行數(shù)學(xué)比較通常不會正常工作,而長度是個例外。
(5)更多
Django有很多內(nèi)置標簽,更多關(guān)于內(nèi)置標簽的信息請參考官方文檔:
https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/ref-templates-builtins-tags
如果需要編寫自定義標簽,請參考官方文檔
https://docs.djangoproject.com/zh-hans/2.2/howto/custom-template-tags/howto-writing-custom-template-tags
如果需要對使用的標簽和自定義的標簽做一份說明文檔,可以使用Django提供的文檔工具,詳情請參考:
https://docs.djangoproject.com/zh-hans/2.2/ref/contrib/admin/admindocs/
過濾器
簡介
過濾器可以對變量做一些操作,例如給變量賦值,改變變量的值等。
修改變量顯示
過濾器可以修改變量的顯示。例如:
django
{{ name|lower }}
通過過濾器lower變量{{ name }}變?yōu)榱诵懽址?,通過管道符(|)間隔變量和過濾器來使用過濾器。
鏈式調(diào)用過濾器
一個過濾器的輸出可以作為下一個過濾器的輸入。
{{ text|escape|linebreaks }}是一種常用的轉(zhuǎn)換方式, 在這之后換行符被替換為了 <p> 標簽。
轉(zhuǎn)換變量和標簽參數(shù)
過濾器轉(zhuǎn)換變量和標簽參數(shù)的值。示例:
django
{{ django|title }}
傳入`{'django': 'the web framework for perfecalist With deadline '}`上下文字典時,該模板呈現(xiàn)為:
django
The Web Framework For Perfectionists With Deadlines
傳入?yún)?shù)給過濾器
示例1:
django
{{ my_date|date:"Y-m-d" }}
my_date將會被替換為當前日期。
示例2:
django
{{ bio|truncatewords:30 }}
將會會顯示 `bio` 變量的前30個字符
注意
過濾器參數(shù)中如果包含空格和標點符號,必須使用引號“”括起來,例如,要用逗號和空格連接列表,可以使用{{list|join:", "}}。
Django提供了大約60個內(nèi)置模板過濾器,請參考官方文檔:
https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/ref-templates-builtins-filters,
下面列舉一些常用的過濾器:
default
如果變量為false或空,則使用給定的默認值。否則,使用變量的值。例如:
django
{{ value|default:"nothing" }}
如果 `value` 沒有提供或者為空,那么將它顯示為 "`nothing`" 。
length
返回值的長度。這對字符串和列表都適用。例如:
django
{{ value|length }}
如果 `value` 為 `['a', 'b', 'c', 'd']`, 那么他將被顯示為 `4`。
filesizeformat
將值格式化為“人類可讀的”文件大小(即“13kb”、“4.1 MB”、“102字節(jié)”等)。例如:
django
{{ value|filesizeformat }}
如果值為123456789,則輸出為117.7 MB。
如果需要自定義過濾器,請參考請官方文檔:
https://docs.djangoproject.com/zh-hans/2.2/howto/custom-template-tags/
注釋
示例:
單行注釋
django
{ this won't be rendered }
多行注釋:{% comment %} 和{% endcomment %}
django
<p>Rendered text with {{ pub_date|date:"c" }}</p>
{% comment "Optional note" %}
<p>Commented out text with {{ create_date|date:"c" }}</p>
{% endcomment %}
注意:Comment標簽不能嵌套使用。
作者簡介:單雨,90后工科男,偽文藝青年。目前就讀于北京理工大學(xué)宇航系,喜歡研究AI,網(wǎng)絡(luò)爬蟲,微信小程序以及機器人,癡迷于Coding,睡前必擼碼。
【END】
jango 是 Python API 開發(fā)中最流行的框架之一,在這個教程中,我們來學(xué)習如何使用它。-- Rachel Waston(作者)
Django 所有 Web 框架中最全面的,也是最受歡迎的一個。自 2005 年以來,其流行度大幅上升。
Django 是由 Django 軟件基金會維護,并且獲得了社區(qū)的大力支持,在全球擁有超過 11,600 名成員。在 Stack Overflow 上,約有 191,000 個帶 Django 標簽的問題。Spotify、YouTube 和 Instagram 等都使用 Django 來構(gòu)建應(yīng)用程序和數(shù)據(jù)管理。
本文演示了一個簡單的 API,通過它可以使用 HTTP 協(xié)議的 GET 方法來從服務(wù)器獲取數(shù)據(jù)。
首先,為你的 Django 應(yīng)用程序創(chuàng)建一個目錄結(jié)構(gòu),你可以在系統(tǒng)的任何位置創(chuàng)建:
$ mkdir myproject
$ cd myproject
然后,在項目目錄中創(chuàng)建一個虛擬環(huán)境來隔離本地包依賴關(guān)系:
$ python3 -m venv env
$ source env/bin/activate
在 Windows 上,使用命令 env\Scripts\activate 來激活虛擬環(huán)境。
然后,安裝 Django 和 Django REST 模塊:
$ pip3 install django
$ pip3 install djangorestframework
現(xiàn)在你的應(yīng)用程序已經(jīng)有了一個工作環(huán)境,你必須實例化一個新的 Django 項目。與 Flask 這樣微框架不同的是,Django 有專門的命令來創(chuàng)建(注意第一條命令后的 . 字符)。
$ django-admin startproject tutorial .
$ cd tutorial
$ django-admin startapp quickstart
Django 使用數(shù)據(jù)庫來管理后端,所以你應(yīng)該在開始開發(fā)之前同步數(shù)據(jù)庫,數(shù)據(jù)庫可以通過 manage.py 腳本管理,它是在你運行 django-admin 命令時創(chuàng)建的。因為你現(xiàn)在在 tutorial 目錄,所以使用 ../ 符號來運行腳本,它位于上一層目錄:
$ python3 ../manage.py makemigrations
No changes detected
$ python4 ../manage.py migrate
Operations to perform:
??Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
??Applying contenttypes.0001_initial... OK
??Applying auth.0001_initial... OK
??Applying admin.0001_initial... OK
??Applying admin.0002_logentry_remove_auto_add... OK
??Applying admin.0003_logentry_add_action_flag_choices... OK
??Applying contenttypes.0002_remove_content_type_name... OK
??Applying auth.0002_alter_permission_name_max_length... OK
??Applying auth.0003_alter_user_email_max_length... OK
??Applying auth.0004_alter_user_username_opts... OK
??Applying auth.0005_alter_user_last_login_null... OK
??Applying auth.0006_require_contenttypes_0002... OK
??Applying auth.0007_alter_validators_add_error_messages... OK
??Applying auth.0008_alter_user_username_max_length... OK
??Applying auth.0009_alter_user_last_name_max_length... OK
??Applying auth.0010_alter_group_name_max_length... OK
??Applying auth.0011_update_proxy_permissions... OK
??Applying sessions.0001_initial... OK
創(chuàng)建一個名為 admin,示例密碼為 password123 的初始用戶:
$ python3 ../manage.py createsuperuser \
??--email admin@example.com \
??--username admin
在提示時創(chuàng)建密碼。
為了使 Django 能夠?qū)⑿畔鬟f給 HTTP GET 請求,必須將信息對象轉(zhuǎn)化為有效的響應(yīng)數(shù)據(jù)。Django 為此實現(xiàn)了“序列化類” serializers。
在你的項目中,創(chuàng)建一個名為 quickstart/serializers.py 的新模塊,使用它來定義一些序列化器,模塊將用于數(shù)據(jù)展示:
from django.contrib.auth.models import User, Group
from rest_framework import serializers
class UserSerializer(serializers.HyperlinkedModelSerializer):
????class Meta:
????????model = User
????????fields = ['url', 'username', 'email', 'groups']
class GroupSerializer(serializers.HyperlinkedModelSerializer):
????class Meta:
????????model = Group
????????fields = ['url', 'name']
Django 中的 視圖 是一個接受 Web 請求并返回 Web 響應(yīng)的函數(shù)。響應(yīng)可以是 HTML、HTTP 重定向、HTTP 錯誤、JSON 或 XML 文檔、圖像或 TAR 文件,或者可以是從 Internet 獲得的任何其他內(nèi)容。要創(chuàng)建視圖,打開 quickstart/views.py 并輸入以下代碼。該文件已經(jīng)存在,并且其中包含一些示例文本,保留這些文本并將以下代碼添加到文件中:
from django.contrib.auth.models import User, Group
from rest_framework import viewsets
from tutorial.quickstart.serializers import UserSerializer, GroupSerializer
class UserViewSet(viewsets.ModelViewSet):
????"""
????API 允許查看或編輯用戶
????"""
????queryset = User.objects.all().order_by('-date_joined')
????serializer_class = UserSerializer
class GroupViewSet(viewsets.ModelViewSet):
????"""
????API 允許查看或編輯組
????"""
????queryset = Group.objects.all()
????serializer_class = GroupSerializer
現(xiàn)在,你可以生成 URL 以便人們可以訪問你剛起步的 API。在文本編輯器中打開 urls.py 并將默認示例代碼替換為以下代碼:
from django.urls import include, path
from rest_framework import routers
from tutorial.quickstart import views
router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'groups', views.GroupViewSet)
# 使用自動路由 URL
# 還有登錄 URL
urlpatterns = [
????path('', include(router.urls)),
????path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]
這個示例項目的設(shè)置模塊存儲在 tutorial/settings.py 中,因此在文本編輯器中將其打開,然后在 INSTALLED_APPS 列表的末尾添加 rest_framework:
INSTALLED_APPS = [
????...
????'rest_framework',
]
現(xiàn)在,你可以測試構(gòu)建的 API。首先,從命令行啟動內(nèi)置服務(wù)器:
$ python3 manage.py runserver
你可以通過使用 curl 導(dǎo)航至 URL http://localhost:8000/users 來訪問 API:
$ curl --get http://localhost:8000/users/?format=json
[{"url":"http://localhost:8000/users/1/?format=json","username":"admin","email":"admin@example.com","groups":[]}]
使用 Firefox 或你選擇的 開源瀏覽器 :
一個簡單的 Django API
有關(guān)使用 Django 和 Python 的 RESTful API 的更多深入知識,參考出色的 Django 文檔 。
Django 的主要優(yōu)點:
Django 的主要缺點:
對你的應(yīng)用程序或 API 來說,Django 是絕佳選擇。下載并熟悉它,開始開發(fā)一個迷人的項目!
via: https://opensource.com/article/19/11/python-web-api-django
作者: Rachel Waston 選題: lujun9972 譯者: MjSeven 校對: wxy
本文由 LCTT 原創(chuàng)編譯, Linux中國 榮譽推出
者:HelloGitHub-追夢人物
我們已經(jīng)成功地開發(fā)了一個功能比較完備的個人博客,是時候來總結(jié)一下我們的工作了。博客系列完整的源代碼地址:
https://github.com/HelloGitHub-Team/HelloDjango-blog-tutorial
現(xiàn)在,我們已經(jīng)有了一個功能比較完備的個人博客應(yīng)用。而且,在測試的保障護航下,我們可以在不破壞現(xiàn)用功能的情況下,輕松加入新的功能。
教程進行到這里,HelloDjango 博客教程就要準備告一段落了,大部分 web 開發(fā)中的需求,你都可以通過教程中講到的知識點,結(jié)合 django 的官方文檔來實現(xiàn)。
Django 中還有很多值得介紹的地方,就拿博客來說,我們還可以做這些很酷的功能:
等等,這些對于其他 Web 系統(tǒng)來說,基本也都是必不可少的。
所以,HelloDjango 博客項目會繼續(xù)以這樣的形式繼續(xù)下去:
圍繞著某一個功能進行開發(fā),功能開發(fā)完成之后附帶輸出一篇詳細介紹功能實現(xiàn)原理和過程的教程。我希望 HelloDjango 博客項目不僅僅是一個教學(xué)演示項目,也不僅僅是一個高質(zhì)量、功能完備的 django 第三方博客應(yīng)用,而是兩者都是!
此外,雖然 HelloDjango 博客項目教程定期更新已經(jīng)結(jié)束,但接下來我會開始以定期更新的方式向大家介紹如何 django-restframework + Vue 或者 React 這種更加現(xiàn)代化的前后端分離開發(fā)方式,大量公司都采用這種開發(fā)方式,如果你以找工作為目的而學(xué)習 django 的話,怎么能不學(xué)習這種開發(fā)模式呢?
HelloDjango-blogs 的教程暫時告一段落,全新的 HelloDjango-django-restframework 系列教程就要要重新?lián)P帆起航了,大家敬請期待!
『講解開源項目系列』——讓對開源項目感興趣的人不再畏懼、讓開源項目的發(fā)起者不再孤單。跟著我們的文章,你會發(fā)現(xiàn)編程的樂趣、使用和發(fā)現(xiàn)參與開源項目如此簡單。歡迎聯(lián)系我、加入我們,讓更多人愛上開源、貢獻開源~
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。