「Django筆記」修訂間的差異
跳至導覽
跳至搜尋
Tankianting(討論 | 貢獻) |
Tankianting(討論 | 貢獻) |
||
(未顯示同一使用者於中間所作的 14 次修訂) | |||
行 11: | 行 11: | ||
app 可以算是一個 project 的功能大分區。但不知道 app 能不能夠共用資料。 | app 可以算是一個 project 的功能大分區。但不知道 app 能不能夠共用資料。 | ||
== 子結構說明 == | == Model, View, Url == | ||
=== 子結構說明 === | |||
* urls.py - url 網頁路徑傳送門 | * urls.py - url 網頁路徑傳送門 | ||
* views.py - 顯示的方式 | * views.py - 顯示的方式 | ||
==urls.py 基礎== | ===urls.py 基礎=== | ||
假設urls.py 的所屬目錄包含 views.py,views.py有user這個函數,我們要傳字串/user/abc 的 abc 當成 user 函數的 username 變數,則可以這樣設定: | 假設urls.py 的所屬目錄包含 views.py,views.py有user這個函數,我們要傳字串/user/abc 的 abc 當成 user 函數的 username 變數,則可以這樣設定: | ||
<pre> | <pre> | ||
行 29: | 行 30: | ||
</pre> | </pre> | ||
==view.py== | ===view.py=== | ||
===回傳 json(ActivityPub 用)=== | ==== 處理 POST body 裏的 json ==== | ||
假設要做 | <pre> | ||
if request.method == 'POST': | |||
post_body_orig = request.body.decode('utf-8') | |||
post_body_json = json.loads(post_body_orig) | |||
post_text = post_body_json["text"] | |||
print(f"結果:{post_text}") | |||
</pre> | |||
====回傳 json(ActivityPub 用)==== | |||
假設要做 [[ActivityPub]]協定,回傳 json 的話,可以這樣設定: | |||
<pre> | <pre> | ||
行 57: | 行 66: | ||
如果不是 John,就回傳 Http404()。 | 如果不是 John,就回傳 Http404()。 | ||
== | === model.py === | ||
*<code>models.DateField</code>儲存日期,<code>models.DateTimeField</code>儲存日期時間。參考:[https://docs.djangoproject.com/en/4.1/ref/models/fields/ Model field reference]。 | |||
* Django 儲存建立時間的時候,會有到微秒 (10^-6 sec) 的小數點。取用資料時要小心,避免踩到坑。 | |||
< | |||
< | |||
==setting.py 使用 SQLite== | ==setting.py 使用 SQLite== | ||
行 109: | 行 83: | ||
</pre> | </pre> | ||
== 建立登入、登出、註冊帳號畫面 == | == 使用者管理 == | ||
=== 用戶的 class === | |||
* <code>[https://docs.djangoproject.com/en/4.1/ref/contrib/auth/#user-model django.contrib.auth]</code> 的 User class,實作了相關的欄位(姓、名、密碼等),可以使用。 | |||
* 如果要擴充自定義 User,使用<code>[https://docs.djangoproject.com/en/4.1/topics/auth/customizing/#django.contrib.auth.models.AbstractBaseUser django.contrib.auth.models 的 AbstractBaseUser]</code>。 | |||
=== 建立登入、登出、註冊帳號畫面 === | |||
* [http://dokelung-blog.logdown.com/posts/234437-django-notes-10-users-login-and-logout Django筆記(10) - 用戶的登入與登出] | * [http://dokelung-blog.logdown.com/posts/234437-django-notes-10-users-login-and-logout Django筆記(10) - 用戶的登入與登出] | ||
* [https://developer.mozilla.org/zh-TW/docs/Learn/Server-side/Django/Authentication Django Tutorial Part 8: User authentication and permissions - MDN] 包含申請帳號的頁面 | * [https://developer.mozilla.org/zh-TW/docs/Learn/Server-side/Django/Authentication Django Tutorial Part 8: User authentication and permissions - MDN] 包含申請帳號的頁面 | ||
* [https://www.learncodewithmike.com/2020/04/django-authentication-and-usercreationform.html [Django教學8]Django UserCreationForm實作網站登入驗證及註冊功能分享] 註冊頁面介紹 | |||
== 佈署 (deploy) Django app、伺服器設定 == | |||
* 參:[[Django筆記/佈署Django專案]] | |||
==參考== | ==參考== |
於 2022年11月14日 (一) 00:19 的最新修訂
這裏是偏碎片化的記錄,另可參考:Django Unleashed筆記。
建立新專案
django-admin startproject [網站目錄名]
跑伺服器
cd [網站目錄名]; ./manage.py runserver [Port number]
app vs project
app 可以算是一個 project 的功能大分區。但不知道 app 能不能夠共用資料。
Model, View, Url
子結構說明
- urls.py - url 網頁路徑傳送門
- views.py - 顯示的方式
urls.py 基礎
假設urls.py 的所屬目錄包含 views.py,views.py有user這個函數,我們要傳字串/user/abc 的 abc 當成 user 函數的 username 變數,則可以這樣設定:
from django.contrib import admin from django.urls import path from . import views urlpatterns = [ path('/users/<slug:username>', views.user), path('admin/', admin.site.urls), ]
view.py
處理 POST body 裏的 json
if request.method == 'POST': post_body_orig = request.body.decode('utf-8') post_body_json = json.loads(post_body_orig) post_text = post_body_json["text"] print(f"結果:{post_text}")
回傳 json(ActivityPub 用)
假設要做 ActivityPub協定,回傳 json 的話,可以這樣設定:
from django.http import Http404, HttpResponse import json from . import config # import the config variables in the file './config.py'. def user(request, username): user_json = {"@context": "https://www.w3.org/ns/activitystreams", "id": config.site_url + "/users/" + username, "inbox": config.site_url + "/users/" + username + "/inbox", "outbox": config.site_url + "/users/" + username + "/outbox", "type": "Person", # the json for the type "name": username , # user name } if username != 'John': raise Http404() # throw 404 else: # return json file with setting content_type return HttpResponse(json.dumps(user_json), content_type="application/activity+json")
如果不是 John,就回傳 Http404()。
model.py
models.DateField
儲存日期,models.DateTimeField
儲存日期時間。參考:Model field reference。- Django 儲存建立時間的時候,會有到微秒 (10^-6 sec) 的小數點。取用資料時要小心,避免踩到坑。
setting.py 使用 SQLite
import os DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
使用者管理
用戶的 class
django.contrib.auth
的 User class,實作了相關的欄位(姓、名、密碼等),可以使用。- 如果要擴充自定義 User,使用
django.contrib.auth.models 的 AbstractBaseUser
。
建立登入、登出、註冊帳號畫面
- Django筆記(10) - 用戶的登入與登出
- Django Tutorial Part 8: User authentication and permissions - MDN 包含申請帳號的頁面
- [Django教學8Django UserCreationForm實作網站登入驗證及註冊功能分享] 註冊頁面介紹
佈署 (deploy) Django app、伺服器設定
參考
- https://docs.djangoproject.com
- https://stackoverflow.com/questions/58024196/nginx-proxy-pass-gunicorn-can-t-be-reached 以及其他 stack overflow 答案
- https://chentsungyu.github.io/2020/07/19/Python/Django/%5BDjango%5D%20%E5%9C%A8Ubuntu%E4%B8%AD%E9%81%8B%E7%94%A8Nginx%E3%80%81Gunicorn%20%E6%9E%B6%E8%A8%AD%20Django%20API%20Server
- https://github.com/ekam317/Website/blob/master/ebdjango/settings.py