2017年11月22日 星期三

Django - 當Django的DEBUG設為False,無法讀取staticfiles的問題

當Django的settings.py中DEBUG由True改為False,為開發環境轉換為生產環境必改的設定。
DEBUG改為False後,讀取靜態檔案發生錯誤,原來DEBUG設置DEBUG為False時,’django.contrib.staticfiles’會關閉,即Django不會自動搜尋靜態檔案。
靜態文件不能讀取導致2個問題:
  1. CSS、JS檔案無法讀取
  2. 通過url不能訪問靜態文件,如圖片、檔案
網路搜尋的處理方式眾多,但隨著Django版本不同,過去的紀錄已不適用。
以下為Django1.11版本參考網路上的紀錄修改後的版本

版本:

System version : Windows 10,Ubuntu16.04   
Python version : Python 3.6.0 :: Anaconda 4.3.1 (64-bit)  
Django version : 1.11.2

檔案結構:

◢ project_name
    ◢ app_name
        ◢ templates
            ◢ app_name
                page1.html
                404.html
        urls.py
        views.py
    ◢ project_name
        settings.py
        urls.py
        views.py
    ◢ static
        ◢ css 
        ◢ js 
        ◢ image 
            favicon.png
    manage.py
project_name/project_name/settings.py
# DEBUG = True
DEBUG = False
STATIC_URL = '/static/'

if DEBUG is False: 
    STATIC_ROOT = (
        os.path.join(BASE_DIR, 'static')
    )

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
)
project_name/project_name/urls.py
加入以下程式碼
from django.views.static import serve
from . import settings
if settings.DEBUG is False:
    urlpatterns.append(url(r'^static/(?P<path>.*)$', serve, {'document_root': settings.STATIC_ROOT}))

Django - 自定義404或500的網頁 - custom 404/500 error page setting

版本:

System version : Windows 10,Ubuntu16.04   
Python version : Python 3.6.0 :: Anaconda 4.3.1 (64-bit)  
Django version : 1.11.2

檔案結構:

◢ project_name
    ◢ app_name
        ◢ templates
            ◢ app_name
                page1.html
                404.html
        urls.py
        views.py
    ◢ project_name
        settings.py
        urls.py
        views.py
    ◢ static
        ◢ css 
        ◢ js 
        ◢ image 
            favicon.png
    manage.py
project_name/project_name/urls.py
加入以下程式碼
handler404 = views.error_404
handler500 = views.error_404
project_name/project_name/views.py
加入以下程式碼
from django.shortcuts import render
def error_404(request):
    return render(request, 'app_name/404.html')
project_name/project_name/settings.py
將DEBUG的值改為False
# DEBUG = True
DEBUG = False

Django - Django網站圖示的變更(favicon.ico,shortcut icon)

版本:

System version : Windows 10,Ubuntu16.04   
Python version : Python 3.6.0 :: Anaconda 4.3.1 (64-bit)  
Django version : 1.11.2

檔案結構:

◢ project_name
    ◢ app_name
        ◢ templates
            ◢ app_name
                page1.html
                404.html
        urls.py
        views.py
    ◢ project_name
        settings.py
        urls.py
        views.py
    ◢ static
        ◢ css 
        ◢ js 
        ◢ image 
            favicon.png
    manage.py
project_name/app_name/templates/app_name/page1.html
在html檔的第一行加上
{% load staticfiles %}
在head標籤內加入
<head>
    <title>...</title>
    <link href="{% static 'image/favicon.png' %}" rel="shortcut icon"></link>    
</head>
如果有做繼承關係的網頁,建議將以上程式碼放到父頁面

2017年11月20日 星期一

Python - Convert xml data to dict to in python - 將xml格式轉換為字典

版本

Python version :Python 3.6.0 :: Anaconda 4.3.1 (64-bit)
System version :Windows 10

Codes:

import xmltodict, json
xml_str = '<root><rule>a</rule><right>1</right></root>'
order_dict_tmp = xmltodict.parse(xml_str)
dict_temp = json.loads(json.dumps(order_dict_tmp))
print( xml_str )
print('-'*35)
print( order_dict_tmp )
print( type(order_dict_tmp) )
print('-'*35)
print( dict_temp )
print( type(dict_temp) )

執行結果:

2017年11月8日 星期三

Python - Convert a dict to XML in python - 將字典轉換為XML的格式

版本

Python version :Python 3.6.0 :: Anaconda 4.3.1 (64-bit)
System version :Windows 10

Codes:

# dict to xml
from xml.etree.ElementTree import Element
from xml.etree.ElementTree import tostring
def dict_to_xml(tag, d):
    ele = Element(tag)
    for key, val in d.items():
        child = Element('key',{'name':key})
        child.text = str(val)
        ele.append(child)
    return ele

dic1 = {'a':5,'123b':22,'c':'str1'}
print(dic1)
print('-'*85)
xml_str = tostring(dict_to_xml('score', dic1)  )
xml_str2 = xml_str.decode()
print(xml_str2)
print('='*85)
xml_str = tostring(dict_to_xml('score', dic1), encoding='utf8', method='xml')
xml_str2 = xml_str.decode()
print(xml_str2)

執行結果: