2019年11月13日 星期三

如何在Django正確使用ManifestStaticFilesStorage這個功能


假設Django專案目錄在/home/myproj。在settings.py要設定
# 靜態檔案對應的URL
STATIC_URL = '/static/'
# 靜態檔案放置的位置,這裡就等於/home/myproj/static
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
# 放置其他靜態檔案的路徑,把css/js等檔案放在這,以下的設置等於/home/myproj/staticfile
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "staticfile"),
)
# 使用ManifestStaticFilesStorage作為靜態檔案處理方式
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'

 在正式運行的伺服器執行
./manage.py collectstatic -v 3
會看到css跟js等檔案都複製到static目錄,並產生附加hash值的檔案。
...
Post-processed 'css/bootstrap.min.css' as 'css/bootstrap.min.a15c2ac3234a.css'
...
每次更動這些檔案後都要執行collectstatic,否則會出錯。

在基礎樣板載入靜態檔案要使用{% load static %}與{% static 'css/bootstrap.min.css' %}來載入靜態檔案。

在Nginx關於靜態檔案目錄的設置
...
location /static {
        alias /home/myproj/static;
    }
...

如果把css/js等檔案放在STATIC_ROOT裡頭,那麼執行collectstatic就不會產生附加hash值的檔案,瀏覽網站就會跳出500錯誤。錯誤Log會有ValueError: Missing staticfiles manifest entry for .... 的訊息。

2019年8月19日 星期一

使用pytz為datetime物件加上時區的注意事項

使用Python的datetime產生的物件是不會包含時區資訊的,在網路上搜尋加上時區的方式,一般都是建議用pytz,大概類似以下的作法。
import datetime
import pytz

mytz = pytz.timezone('Asia/Taipei')
mytime = datetime.datetime.now().replace(tzinfo=mytz)

print(mytime)
2019-08-19 14:56:50.450396+08:06
結果的確會顯示時區,不過好像哪裡怪怪的?台北所在的時區應該是+08:00,怎麼會變成+08:06,多加了六分鐘?

pytz的文件在開頭有提到,因為與Python內建的tzinfo API有實做上的差異,如果要顯示當地的時區,需使用localize()這個方法,範例如下。
import datetime
import pytz

mytz = pytz.timezone('Asia/Taipei')
mytime = mytz.localize(datetime.datetime.now())

print(mytime)

2019-08-19 14:56:50.450396+08:00
這樣就會顯示正確的時區。

2019年5月21日 星期二

在Linux使用Ricoh多功能事務機,無法輸入使用者代碼的問題

使用環境
Kubuntu 18.04
Ricoh Aficio MP C3300

使用情境
印表機有設定使用者代碼來統計各部門的使用量,並限制彩色列印功能。

在Windows的印表機設定很容易設定使用者代碼,在Linux上頭並不是…好吧,現在可以看到設定選項,但是會發現怎麼設定都沒有效果,永遠都會選擇預設的選項,而且沒辦法改變預設的代碼。
搜尋網路找到這一篇,但是沒有效果。這篇文章裡頭有提到OpenPrinting網站的FAQ,可是裡頭的說明不是很清楚。

我最後解決的方式是從OpenPrinting網站下載PPD檔案修改,以C3300為例,網站上提供三種版本分別是PDF、Postscript、pxlcolor,PDF的版本按下列印就會被取消,我是用Postsciprt版本。

要修改以下兩行
*DefaultUserCode: None
*UserCode 1001/1001: "/usrcode(1001)def\n"
修改上面三個紅色的部份,填入正確的使用者代碼(這邊是用1011為例子)
*DefaultUserCode: 1011
*UserCode 1011/1011: "/usrcode(1011)def\n"
結果如下圖 
存檔,然後安裝印表機,要選擇用這個檔案安裝。安裝完成後進入設定選項應該會如同第一張圖,紙張大小與列印顏色也要改成正確的設定,不然還是無法列印。

2019年1月18日 星期五

Linux桌面多使用者登入,類似LTSP的作法 rev.2

上一篇是古早時代的作法,lightdm早就內建支援VNC,中間不需要透過XDMCP,這樣穩定性也比較好,而且還是支援多使用者。

作法:
  1. 安裝tigervnc-standalone-server
  2. 編輯/etc/lightdm/lightdm.conf,加上
    [VNCServer]
    enabled=true
    command=Xvnc -SecurityTypes None
    port=5900
    listen-address=0.0.0.0
    width=1024
    height=768
    depth=24
    SecurityTypes設定None代表不使用VNC的內建驗證方式與加密,但是在lightdm還是要輸入帳號密碼登入。參數的詳細說明
  3. (可選)把SecurityTypes改成TLSNone使用連線加密,或者使用SSH或VPN提昇安全性
  4. 重新啟動lightdm
  5. 使用vncviewer連入