今天在整理筆記時找到這篇 2019 年底寫的文章, 看起來有發布過, 不知為何又被改回草稿, 看完後覺得具有參考價值, 所以重新發布 :
[2019-09-11]
- 在樹莓派 Raspbian Stretch 上安裝 Nginx 伺服器
- 在樹莓派 Nginx 伺服器上執行 Python 網頁應用程式
- Python 學習筆記 : Django 2 測試 (一) : 請求與回應處理
1. 安裝或更新 Django :
因為之前安裝的 Django 版本可能有點舊了, 所以在重新測試之前先用 pip3 install django 指令升版, 在後面加上 -U 參數可更新到最新版 :
pi@raspberrypi:~ $ pip3 install django -U
Collecting Django
Using cached https://files.pythonhosted.org/packages/39/b0/2138c31bf13e17afc32277239da53e9dfcce27bac8cb68cf1c0123f1fdf5/Django-2.2.3-py3-none-any.whl
Collecting sqlparse (from Django)
Using cached https://files.pythonhosted.org/packages/ef/53/900f7d2a54557c6a37886585a91336520e5539e3ae2423ff1102daf4f3a7/sqlparse-0.3.0-py2.py3-none-any.whl
Collecting pytz (from Django)
Using cached https://files.pythonhosted.org/packages/3d/73/fe30c2daaaa0713420d0382b16fbb761409f532c56bdcc514bf7b6262bb6/pytz-2019.1-py2.py3-none-any.whl
Installing collected packages: sqlparse, pytz, Django
Successfully installed Django-2.2.3 pytz-2019.1 sqlparse-0.3.0
pi@raspberrypi:~ $ python3 -m django --version
2.2.3
2. 在 Nginx 虛擬目錄下建立 Djando 網站 :
我的目標是在樹莓派上以 Nginx 作為 HTTP 伺服器佈署 Django 專案, Nginx 伺服器的操作指令整理如下表 :
Nginx 伺服器操作指令 | 說明 |
nginx -s start | 啟動伺服器 |
nginx -s stop | 停止伺服器 |
nginx -t | 檢視伺服器狀態 |
nginx -s reload | 重啟伺服器 |
Nginx 伺服器的所有站台設定檔放在 /etc/nginx/sites-enabled/ 目錄下, 預設站台設定檔為 default, 其預設根目錄絕對路徑為 /var/www/html, 預設監聽埠號為 80 埠. 安裝好 Nginx 後在瀏覽器中開啟 localhost 或 127.0.0.1 或我為樹莓派指定之固定 IP 192.168.2.192 都會看到一個 Nginx 的歡迎網頁.
我們可以直接在 /var/www/html 下佈署 Web 專案, 但為了保留 Nginx 預設站台之歡迎網頁 (作為測試 Nginx 有否開啟用), 我在前次的 "在樹莓派 Raspbian Stretch 上安裝 Nginx 伺服器" 這篇裡面已於 /var/www/ 下建立一個子目錄 test, 除了將 /var/www/test 設定為虛擬目錄外, 還進一步將此虛擬目錄設定成一個虛擬站台 test.com, 亦即若在 /var/www/test 下佈署 Django 專案的話, 可以用 localhost/test/mysite 或 test.com/mysite 去瀏覽網頁.
OK, 這樣就可以在 /var/www/test 底下建立一個 Django 網站了, 但是一出手就不太順, 直接以 Windows 下所用的 django-admin startproject mysite 指令建立網頁專案時就出現 "Command not found" 錯誤 :
pi@raspberrypi:~ $ cd /var/www/test
pi@raspberrypi:/var/www/test $ django-admin startproject mysite
bash: django-admin:命令找不到
經查詢才知道原來在 Linux 底下還要幫所安裝的 Django 套件在 /usr/local/bin 底下建立連結, 才能在任何目錄下執行其管理指令, Windows 因為在安裝 Python 時已把 Scripts 放在環境變數裡, 因此可以馬上執行所安裝的套件, 參考 :
# Command not found: django-admin.py
# -bash: django-admin: command not found
用 pip3 show 檢視 Django 安裝位置 :
pi@raspberrypi:~ $ pip3 show django
Name: Django
Version: 2.2.3
Summary: A high-level Python Web framework that encourages rapid development and clean, pragmatic design.
Home-page: https://www.djangoproject.com/
Author: Django Software Foundation
Author-email: foundation@djangoproject.com
License: BSD
Location: /home/pi/.local/lib/python3.5/site-packages
Requires: sqlparse, pytz
可見 Django 被安裝在 /home/pi/.local/lib/python3.5/site-packages 底下, 用 ls 指令檢視 djando 子目錄 :
pi@raspberrypi:/var/www/test $ ls -ls /home/pi/.local/lib/python3.5/site-packages/django
總計 84
4 drwxr-xr-x 3 pi pi 4096 4月 9 00:37 apps
4 drwxr-xr-x 3 pi pi 4096 4月 9 00:37 bin
4 drwxr-xr-x 7 pi pi 4096 4月 9 00:37 conf
4 drwxr-xr-x 18 pi pi 4096 4月 9 00:37 contrib
4 drwxr-xr-x 11 pi pi 4096 4月 9 00:37 core
4 drwxr-xr-x 6 pi pi 4096 4月 9 00:37 db
4 drwxr-xr-x 3 pi pi 4096 4月 9 00:37 dispatch
4 drwxr-xr-x 5 pi pi 4096 4月 9 00:37 forms
4 drwxr-xr-x 3 pi pi 4096 4月 9 00:37 http
4 -rw-r--r-- 1 pi pi 799 7月 31 08:30 __init__.py
4 -rw-r--r-- 1 pi pi 211 7月 31 08:30 __main__.py
4 drwxr-xr-x 3 pi pi 4096 4月 9 00:37 middleware
4 drwxr-xr-x 2 pi pi 4096 4月 9 00:37 __pycache__
8 -rw-r--r-- 1 pi pi 5588 7月 31 08:30 shortcuts.py
4 drwxr-xr-x 5 pi pi 4096 4月 9 00:37 template
4 drwxr-xr-x 3 pi pi 4096 4月 9 00:37 templatetags
4 drwxr-xr-x 3 pi pi 4096 4月 9 00:37 test
4 drwxr-xr-x 3 pi pi 4096 4月 9 00:37 urls
4 drwxr-xr-x 4 pi pi 4096 4月 9 00:37 utils
4 drwxr-xr-x 6 pi pi 4096 4月 9 00:37 views
Django 的工具程式 django-admin 則是放在 bin 子目錄下 :
pi@raspberrypi:~ $ ls -ls /home/pi/.local/lib/python3.5/site-packages/django/bin
總計 8
4 -rwxr-xr-x 1 pi pi 128 7月 30 16:45 django-admin.py
4 drwxr-xr-x 2 pi pi 4096 4月 9 00:37 __pycache__
所以必須為此 django-admin.py 在 /usr/local/bin 底下建立連結才能在任何目錄下執行此程式 :
sudo ln -s /home/pi/.local/lib/python3.5/site-packages/django/bin/django-admin.py /usr/local/bin
在建立連結之前先檢查 /usr/local/bin :
總計 976
4 -rwxrwxr-x 1 root staff 70 4月 6 15:49 checkwifi.sh
972 -rwxr-xr-x 1 root staff 992484 4月 5 10:58 uwsgi
目前只有之前回報 IP 檢查 WiFi 連線用的 shell 程式 checkwifi.sh 與所安裝的 uwsgi 而已. 執行建立 django-admin.py 連結之指令 :
pi@raspberrypi:/var/www/test $ sudo ln -s /home/pi/.local/lib/python3.5/site-packages/django/bin/django-admin.py /usr/local/bin
pi@raspberrypi:/var/www/test $ ls -ls /usr/local/bin
總計 980
4 -rwxrwxr-x 1 root staff 70 4月 6 15:49 checkwifi.sh
4 lrwxrwxrwx 1 root staff 70 7月 31 11:45 django-admin.py -> /home/pi/.local/lib/python3.5/site-packages/django/bin/django-admin.py
972 -rwxr-xr-x 1 root staff 992484 4月 5 10:58 uwsgi
可見連結已建立, 但在 /var/www/test 底下用 django-admin.py 指令建立一個網站 mysite 時卻還是失敗, 但這回出現的是 "No module named django.core" 的錯誤訊息 :
pi@raspberrypi:/var/www/test $ django-admin.py startproject mysite
Traceback (most recent call last):
File "/usr/local/bin/django-admin.py", line 2, <module>
from django.core import management
ImportError: No module named django.core
即使在 /home/pi 底下也是一樣 :
pi@raspberrypi:~ $ django-admin.py startproject mysite
Traceback (most recent call last):
File "/usr/local/bin/django-admin.py", line 2, in <module>
from django.core import management
ImportError: No module named django.core
經爬文研究在下面這篇文章發現可能是 Python 版本的關係, 參考 :
因為 Rasbian 預設 python 指令是 v2.7 版, 而我的 Django 等套件都是安裝在 Python 3 底, 所以我之前在安裝完 Rasbian 後有用 alias 指令將 Python 3.5 版指令取 python3 的別名, 但執行 django-admin.py 時卻會預設執行 Python 2.7, 導致找不到 django.core 模組.
依照其建議應移除 /usr/bin/python 與 Python 2.7 的連結, 再建立 Python 3 與 /usr/bin/python 的連結 :
pi@raspberrypi:~ $ sudo rm -f /usr/bin/python
pi@raspberrypi:~ $ sudo ln -s /usr/bin/python3 /usr/bin/python
pi@raspberrypi:~ $ python -V
Python 3.5.3
pi@raspberrypi:~ $ which python
/usr/bin/python
可見這樣執行 .py 預設就會使用 Python 3 了, 再次於 /home/pi 底下執行 django-admin.py 就成功了, 順利建立了 mysite 網站架構 :
pi@raspberrypi:~ $ django-admin.py startproject mysite
pi@raspberrypi:~ $ tree mysite
mysite
├── manage.py
└── mysite
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
1 directory, 5 files
這時切換到 mysite 底下執行 manage.py 並開啟 8000 運行 Django 本身的開發伺服器 :
pi@raspberrypi:~/mysite $ python manage.py runserver 127.0.0.1:8000
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
July 31, 2019 - 11:07:19
Django version 2.2.3, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
然後開啟樹莓派的 Chromium 瀏覽器連線 localhost:8000 即顯示 Django 歡迎網頁 :
[31/Jul/2019 11:08:08] "GET / HTTP/1.1" 200 16348
[31/Jul/2019 11:08:08] "GET /static/admin/css/fonts.css HTTP/1.1" 200 423
[31/Jul/2019 11:08:09] "GET /static/admin/fonts/Roboto-Regular-webfont.woff HTTP/1.1" 200 85876
[31/Jul/2019 11:08:09] "GET /static/admin/fonts/Roboto-Bold-webfont.woff HTTP/1.1" 200 86184
[31/Jul/2019 11:08:09] "GET /static/admin/fonts/Roboto-Light-webfont.woff HTTP/1.1" 200 85692
Not Found: /favicon.ico
[31/Jul/2019 11:08:09] "GET /favicon.ico HTTP/1.1" 404 1972
這時切換到 mysite 底下執行 manage.py 並開啟 8000 運行 Django 本身的開發伺服器 :
pi@raspberrypi:~/mysite $ python manage.py runserver 127.0.0.1:8000
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
July 31, 2019 - 11:07:19
Django version 2.2.3, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
然後開啟樹莓派的 Chromium 瀏覽器連線 localhost:8000 即顯示 Django 歡迎網頁 :
[31/Jul/2019 11:08:08] "GET / HTTP/1.1" 200 16348
[31/Jul/2019 11:08:08] "GET /static/admin/css/fonts.css HTTP/1.1" 200 423
[31/Jul/2019 11:08:09] "GET /static/admin/fonts/Roboto-Regular-webfont.woff HTTP/1.1" 200 85876
[31/Jul/2019 11:08:09] "GET /static/admin/fonts/Roboto-Bold-webfont.woff HTTP/1.1" 200 86184
[31/Jul/2019 11:08:09] "GET /static/admin/fonts/Roboto-Light-webfont.woff HTTP/1.1" 200 85692
Not Found: /favicon.ico
[31/Jul/2019 11:08:09] "GET /favicon.ico HTTP/1.1" 404 1972
但是如果在 Nginx 的預設站台 /var/www/html 或上一篇文章中自建的虛擬目錄 /var/www/test 執行 django-admin.py 卻出現 "No module named 'django'" 的錯誤訊息, why?
pi@raspberrypi:/var/www/test $ sudo django-admin.py startproject mysite
Traceback (most recent call last):
File "/usr/local/bin/django-admin.py", line 2, in <module>
from django.core import management
ImportError: No module named 'django'
因為我對 Linux 的設定還不熟, 所以這個問題以後再研究.
總結以上測試, 結論是 :
- 要把 Django 安裝目錄下的 django-admin.py 與 /user/local/bin 建立連結 :
sudo ln -s /home/pi/.local/lib/python3.5/site-packages/django/bin/django-admin.py /usr/local/bin - 要把預設的 python 指令改連結到 Python 3 程式 :
sudo rm -f /usr/bin/python
sudo ln -s /usr/bin/python3 /usr/bin/python
django-admin.py startproject mysite
參考 :
# 使用uWSGI和nginx来设置Django和你的web服务器
# 树莓派部署django项目
# 在樹莓派上搭建 Nginx + uWSGI + Django 架構伺服器的過程中所學到的
# Django Uwsgi Nginx 實現生產環境部署
# Python/WSGI应用快速入门
# 树莓派:django,uwsgi,nginx安装与设置
# 三步在樹莓派上部署nginx+uWSGI+flask
# Setting up an NGINX web server on a Raspberry Pi
# 树莓派部署django项目 (一鍵重啟)
# 树莓派:django,uwsgi,nginx安装与设置
# linux複製指定目錄下的全部檔案到另一個目錄中,linux cp 資料夾
# 在Raspbian上安裝nginx、PHP、Django與uWSGI
# No Module named django.core
沒有留言 :
張貼留言