Django admin CSS 遺失的問題

Django 嘗試使用 Nginx + uwsgi 去部署後,出現 admin 的 CSS, Javascript……等,都噴 404

分析

在我的 Django 專案中,setting.py中配置是這樣

STATIC_URL ='/static/'
STATICFILES_DIRS =(
    os.path.join(BASE_DIR,“static”),
)

 

解決方案決之路

在 setting.py 中新增配置 STATIC_ROOT ,然後執行 python manage.py collectstatic

此時關於 static 的配置如下

STATIC_ROOT ='/opt/nginx/static/'
STATIC_URL ='/static/'
STATICFILES_DIRS =(
    os.path.join(BASE_DIR,“static”),
)

 

可以看出 python manage.py collectstatic 會收集 Django 中所有的靜態資源,並且放到 STATIC_ROOT 管理訪問

此時,修改 Nginx 中關於 Django 項目的 static 配置為:

location /static {
    # alias /project/django/simpleblog/static;
    alias /opt/nginx/static;
}

最後 admin 就可以正常用 css 了!

Django 從 SQLite 切換到 MySQL 時總是提示 No module named ‘MySQLdb’

初次使用 Django ,預設的資料庫是 SQLite ,想切換使用 MySQL,配置了資料庫之後,runserver 總是會出錯

'Did you install mysqlclient or MySQL-python?' % e
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No module named 'MySQLdb'.
Did you install mysqlclient or MySQL-python?

後來查資料,看來是 python3 之後,原本的 python2 的 mysqldb 已經不能連接 mysql 了,要改成使用pymysql,來連接 mysql 。

於是我嘗試使用 pip 安裝了 PyMySQL,還是報錯,所以我再查了一下,原來還要在網站設定的 __init__.py 文件中再添加

import pymysql
pymysql.install_as_MySQLdb()

這樣就可以正常連接 MySQL 了,供大家參考

Django 將所有的 app 放到統一的目錄下進行管理

Django 的 project 寫久了,app 會越來越多,然後就零散在整個專案下,很雜亂,所以研究了一下,能不能將 app 集中放在同個資料夾下面做管理

看了一下網路上的文章後,方法很簡單

首先在專案資料夾底下新建一個資料夾 apps

接著,將設計的好的 app,拖放到 apps 中

記得最後要修改 settings.py 運行時的的搜尋路徑

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 在這行底下添加
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))

另外,不要忘記 import sys

最後,啟動伺服器 runserver,測試看看有沒有設置成功

Flask 下使用 APscheduler

因為工作關係,目前執行的專案是採用 flask,因為要做工作的排程,所以用了 APscheduler 這個模組。

在 flask 下,如果要使用 APscheduler 可以考慮使用 flask 延伸模組 flask-apsheduler

基本使用方法

  from flask import Flask
from flask_apscheduler import APScheduler


class Config(object):
    JOBS = [
        {
            'id': 'job1',
            'func': 'jobs:job1',
            'args': (1, 2),
            'trigger': 'interval',
            'seconds': 10
        }
    ]

    SCHEDULER_API_ENABLED = True


def job1(a, b):
    print(str(a) + ' ' + str(b))

if __name__ == '__main__':
    app = Flask(__name__)
    app.config.from_object(Config())

scheduler = APScheduler()
# it is also possible to enable the API directly
# scheduler.api_enabled = True
scheduler.init_app(app)
scheduler.start()
app.run()

 

一些心得

這個專案是跑在 ubuntu 加上 gunicorn,在使用 gunicorn 的時候,定時任務會重複啟動很多次,找了一下網路上的資源,問題在使用 gunicorn 對 flask 應用進行控制的時候如果設置了 gunicorn 的 --worker 參數大於 1 時,會出現一個定時任務執行多次的問題,此時要給 gunicorn 提供一個額外的 --preload 參數,這樣 flask 的 app 在 run 定時任務就只會執行一次。

env/bin/gunicorn module_containing_app:app -b 0.0.0.0:8080 --workers 3 --preload

 

還有,當 flask 在 debug 模式下使用 flask-apscheduler 定時任務時也會執行多次,問題與上面的問題類似,只要在 debug 模式下給 app.run() 添加一個參數 use_reloader 即可。

app.run(debug=True, use_reloader=False)