2019年2月14日 星期四

[Python] Django的一個入門範例

Python中的各種web framework中,我最先知道的就是Django,這篇就稍微紀錄一下Django基本用法。
我是使用 Django 2.1.1 這個版本



如何安裝Django?
總之使用 pip 就可以輕鬆安裝使用了!

首先我們需要透過指令來建立Django的專案。

常用指令:

建立專案:
  django-admin startproject [ProjectName]

建立應用(一專案可含多個應用):
  python manage.py startapp [AppName]

執行上兩指令後會產生這樣的目錄:
    projectname/
        - manage.py:是Django用於管理專案的命令列工具
        - projectname/
                - __init__.py
                - setting.py:Django專案設定檔
                - urls.py:專案的URL路由對映
                - wsgi.py:定義WSGI的介面資訊,用於與其他Web伺服器整合(一般無須改動)
        - appname/
                - __init__.py
                - admin.py:註冊models
                - apps.py:app資訊定義檔案。類別AppConfig用於定義應用明等Meta資料
                - models.py:定義models
                - tests.py:測試
                - views.py:定義URL回應函數
                - migrations/
                      - __init__.py





範例:
  跟上一篇 GAE 做相同的事。

先看一下最後的專案結構:
    projectname/
        - manage.py
        - projectname/
                - __init__.py
                - setting.py
                - urls.py
                - wsgi.py
        - appname/
                - __init__.py
                - admin.py
                - apps.py
                - models.py
                - tests.py
                - views.py
                - urls.py         <-- new
                - templates/    <-- new
                        - home.html 
                - migrations/
                      - __init__.py
                      - ...

設定專案:
  要記得在 projectname/setting.py 中告訴 Django 需要安裝應用app中的模型。

  在 setting.py 的 INSTALLED_APPS 新增 appname.apps.AppConfig (就是我們自己的app)
  projectname/setting.py:
INSTALLED_APPS = [
    'appname.apps.AppConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]


URL對映:
  一般在 projectname/url.py 我們會設定url與應用app的對映,然後在應用app的資料夾中新增新的url.py,其中寫入各項服務的url對映。

  在這裡我們設計這個url: localhost/appname 連結到views.py中名叫welcome的function

  projectname/url.py:
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('appname/', include('appname.urls')), ## include() takes a full Python import path to another URLconf module
    path('admin/', admin.site.urls),
]

  projectname/appname/url.py:
from django.urls import path
from . import views

urlpatterns = [
    path('', views.welcome),
]


Model層處理:
  在我們的應用中要儲存用戶名與其所傳出的訊息及傳出時間,因此我們需要建立Model類別,這相當於建立資料庫的表格。

  首先要在projectname/appname/admin.py中進行Model的註冊,我們註冊了Greeting這個表格
  projectname/appname/admin.py:
from django.contrib import admin
from .models import Greeting

admin.site.register(Greeting)

  projectname/appname/models.py:這裡描述Model內容
from django.db import models

class Greeting(models.Model):
 name = models.CharField(max_length=50)
 message = models.CharField(max_length=200)
 timestamp = models.DateField(auto_now=True)


Views層處理:
  welcome()裡我們接收打進 localhost/appname 這個位置的請求(request)
  render() 預設存取 projectname/appname/templates/ 裡的檔案,不須寫完整的檔案路徑
  projectname/appname/views.py:
from django.shortcuts import render
from appname.models import Greeting

def welcome(request):  
    results = Greeting.objects.all()
    context = {'greetings': results}

    if request.method == 'POST':
        user = request.POST['user_name']
        message = request.POST['message']
        Greeting(name=user, message=message).save()
    return render(request, "home.html", context)


  projectname/appname/templates/home.html:
<!DOCTYPE html>
<html>
    <head></head>
    <body>
    <h1>My Guest Book</h1>
    <form action="." method="post">
        {% csrf_token %}
        <p>Name: <input type="text" name="user_name"></p>
        <p>Message: <textarea name="message"></textarea></p>
        <input type="submit" value="send"></p>
    </form>

    {% for greeting in greetings %}
    {{ greeting.timestamp}} - {{greeting.name}} said {{greeting.message}}
    <br>
    {% endfor %}
    </body>
</html>




測試:
首先要產生資料移植檔案 (makemigrations):
  python manage.py makemigrations [appname]


  從輸出可以看到模型Greeting的建立,另外輸出的 0001_initial.py 是資料庫產生的中間檔案,在makemigrations的過程中,Django會比較models.py中的模型與已有資料庫之間的差異,如果沒有差異則不會做任何工作。
  要記得如果有對model.py做任何修改,都需再做makemigrations,才能將修改的內容同步到資料庫中。

接著移植到資料庫
  python manage.py migrate

  在模型的修改過程中可以隨時呼叫 makemigrations 產生中間移植檔案,而當需要使移植檔案生效、修改真實的資料庫 schema 時,則需要透過manage.py的migrate指令使修改同步資料庫中。
  基本上這兩步,有修改DB時都要做。


然後我們就可以啟動網站了:
  python manage.py runserver localhost:8000
接著只要在瀏覽器輸入 localhost:8000/app 就可以看到我們的網頁了


另外,Django有一個特色是它會幫我們建立一個簡單的後台管理介面,只要在瀏覽器輸入 localhost:8000/admin 就可以進入,但在第一次登入前要先設定帳號和密碼。

設定管理員的帳密:
  python manage.py createsuperuser
  (密碼想說只是測試,所以我亂打1234,結果不能設定這麼簡單,居然要八碼以上...)
瀏覽器輸入 localhost:8000/admin ,然後登入就可以看到這樣的畫面了
(是真的滿陽春的XD)



  透過這個範例,我們大概知道如何使用Django的路由對映和建立Model,如此應該就可以做出一個還像樣的網頁。

參考資料:
  1. 一次搞定:所有Python Web框架開發百科全書  (佳魁出版)



沒有留言:

張貼留言