「Django筆記」修訂間的差異

出自Tan Kian-ting的維基
跳至導覽 跳至搜尋
 
(未顯示同一使用者於中間所作的 15 次修訂)
行 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===
 
==== 處理 POST body 裏的 json ====
假設要做 activitypub 協定,回傳 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()。


==設定Gunicorn(這可能沒有用)==
=== model.py ===
    /etc/systemd/system/gunicorn.service                                                             
*<code>models.DateField</code>儲存日期,<code>models.DateTimeField</code>儲存日期時間。參考:[https://docs.djangoproject.com/en/4.1/ref/models/fields/ Model field reference]。
<pre>
* Django 儲存建立時間的時候,會有到微秒 (10^-6 sec) 的小數點。取用資料時要小心,避免踩到坑。
 
Group=www-data
WorkingDirectory=/root/lianlok               
ExecStart=/usr/local/bin/gunicorn(或其他絕對路徑) --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock lianlok.wsgi:application
[Install]
WantedBy=multi-user.target
</pre>
 
==設定 nginx==
 
site-available 裏面的 test 設定檔為:
 
前提要先 ./manage.py runserver 8080。
<pre>
server {
listen 80;
server_name 127.0.0.1;
 
# https://docs.djangoproject.com/en/dev/howto/static-files/#serving-static-files-in-production
# location /static/ { # STATIC_URL
#    alias /home/www/example.com/static/; # STATIC_ROOT
#                  }
 
    access_log /root/log/lianlok-access.log;
    error_log /root/log/lianlok-error.log;
 
    location / {
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Scheme $scheme;
            proxy_pass http://127.0.0.1:8080;
        }
}
</pre>
 
==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

建立登入、登出、註冊帳號畫面

佈署 (deploy) Django app、伺服器設定

參考