iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 9
2
寫在前面

翻到一半發現有簡體版可以看,不過我想我還是就看英文版翻吧!
如果覺得我翻的摸不著頭緒可以去看看簡體版

承上篇 來源

簡化對 db 進行存取

框架提供 layer 讀取、寫入、查詢、刪除 db 裡的資料 ,
而 layer 有 Object-Relational Mapper ( ORM ) 的特性。
(這裡的 layer 有階段性或階層的意思 ; 相關資料可以看
【筆記】Architectural pattern (架構模式) - 橘子亂說話
, 這篇文章也有帶到其他前面提過的主題)

ORM 有兩個好處:

  • 直接換置底層資料庫,不需要去改 code , 這允許開發者根據用途最佳化不同 db 的特徵 ( 跟我一樣看完覺得:「蛤?」的人直接點下面連結 ... )
  • 框架可以執行基本的資料驗證 , 這讓資料更安全、更容易檢查資料是以正確的形式或型別被存入 , 及避免惡意攻擊 ( crackers(破解者) 會用合法的 pattern 幹些勾當,像是刪除 db 記錄 )

以 Django 為例 , 他具有 ORM , 參考用來定義記錄結構 object 稱作 model
model 規範檔案儲存的型態 , 同時處理基本的驗證 ( 例如我們填信箱欄位時的驗證 ) , 如字串長度、預設值、選項 ... 。

關於 model & ORM 的資訊請參照下列我的參考資料 , 阮一峰大師的教學裡面有 JS 的 code 範例 。
這邊有些句子實在是頗難翻譯請容我略過翻譯,而且我好像庫存快沒了

下面這段 code , 有規範文字長度 、 預設值 ... 等等。
team_level 是一個 field ( 在上面參考文章中翻為字段 )

#best/models.py

from django.db import models 

class Team(models.Model): 
    team_name = models.CharField(max_length=40) 

    TEAM_LEVELS = (
        ('U09', 'Under 09s'),
        ('U10', 'Under 10s'),
        ('U11', 'Under 11s'),
        ...  #list our other teams
    )
    team_level = models.CharField(max_length=3,choices=TEAM_LEVELS,default='U11')

Django model 有提供簡易的 db 查詢 API , 可以同時設定許多不同的查詢條件。
例如: 結果要完全符合 、 大小寫是否需要完全符合 、 字數大於多少 ...

而這段 code 是 view function (resource handler) 呈現 U09 隊伍資料。
可以注意倒數第三行的 filter() 還有裡面參數的命名方式

#best/views.py

from django.shortcuts import render
from .models import Team 

def youngest(request):
    list_teams = Team.objects.filter(team_level__exact="U09")
    context = {'youngest_teams': list_teams}
    return render(request, 'best/index.html', context)

資料渲染

框架的 templating 系統 , 讓資料輸出 、 產出 HTML , 也可以產出其他類型的文件檔案

框加從儲存的資料產出的形式包含 JSON, XML

Django 允許變數使用 雙花括弧(大括號) 來區別變數 , 甚至可以用 {% expression %} 寫入 expressions ( 如 loop, if ... )

Note: 很多 templating system 的語法都很相似: Python 的 Jinja2 , JS 的 handlebars, moustache 等等

例如:

#best/templates/best/index.html

<!DOCTYPE html>
<html lang="en">
<body>

 {% if youngest_teams %}
    <ul>
    {% for team in youngest_teams %}
        <li>{{ team.team_name }}</li>
    {% endfor %}
    </ul>
{% else %}
    <p>No teams are available.</p>
{% endif %}

</body>
</html>

上一篇
八日: Server-side web frameworks ( 框架能做的事 )
下一篇
十日: Server-side web frameworks ( 如何為自己選個框架 )
系列文
還在想要買哪一堂線上課程嗎?培養看文件的習慣吧!用 MDN 文件學後端:NodeJS & MongooseDB30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

我要留言

立即登入留言