1. 程式人生 > >Django基於Pycharm開發之四[關於靜態文件的使用,配置以及源碼分析](原創)

Django基於Pycharm開發之四[關於靜態文件的使用,配置以及源碼分析](原創)

OS director 一個 pin mes map text 開發人員 容易

對於django靜態文件的使用,如果開發過netcore程序的開發人員,可能會比較容易理解django關於靜態文件訪問的設計原理,個人覺得,這是一個middlerware的設計,但是在django中我們在配置中看到,他其實並不是放在middleware中配置的,反倒變成了一個app。

一 。先來看看關於static靜態文件的搜索原理以及為什麽默認可以找到static文件夾下的靜態文件

<link rel="stylesheet" type="text/css" href="{% static ‘polls/css/polls.css‘ %}"/>

按住ctrl+鼠標左鍵,pycharm會幫你導航到

技術分享圖片

load static 這個指令是通過: django/templatetags/static.py 來加載配置中的靜態文件的目錄的,具體是通過這個源碼來實現的:

class ConfiguredStorage(LazyObject):
def _setup(self):
self._wrapped = get_storage_class(settings.STATICFILES_STORAGE)()


staticfiles_storage = ConfiguredStorage()

settings.STATICFILES_STORAGE 可以查看global_setting.py來找到配置,如果project的setting.py沒有任何配置的話,而
global_setting.py是引用了 /django/contrib/staticfiles/finders.py 這個包的,在這個包裏面,我們可以找到這個:
class AppDirectoriesFinder(BaseFinder):
"""
A static files finder that looks in the directory of each app as
specified in the source_dir attribute.
"""
storage_class = FileSystemStorage
source_dir = ‘static‘


def __init__(self, app_names=None, *args, **kwargs):
# The list of apps that are handled
self.apps = []
# Mapping of app names to storage instances
self.storages = OrderedDict()
app_configs = apps.get_app_configs()
if app_names:
app_names = set(app_names)
app_configs = [ac for ac in app_configs if ac.name in app_names]
for app_config in app_configs:
app_storage = self.storage_class(
os.path.join(app_config.path, self.source_dir))
if os.path.isdir(app_storage.location):
self.storages[app_config.name] = app_storage
if app_config.name not in self.apps:
self.apps.append(app_config.name)
super().__init__(*args, **kwargs)
在這裏,我們就知道為什麽默認django會找這個static的目錄去解析靜態文件了

二。比如我們配置了
STATIC_URL = ‘/staticsaaaa/‘
STATIC_ROOT = os.path.join(BASE_DIR, ‘statics‘)
STATICFILES_DIRS = (os.path.join(BASE_DIR, ‘polls/staticpolls‘),)
比如這樣,那麽,初始化的時候,靜態文件的解析路徑,將會按照 配置的格式來解析,可以看到,我在POLLS這個APP中,我故意將靜態文件放在了staticpolls文件夾下,是這樣的:

技術分享圖片

測試一下:

技術分享圖片

查看生成的鏈接,好了,現在按我們寫的內容來顯示鏈接地址了。

Django基於Pycharm開發之四[關於靜態文件的使用,配置以及源碼分析](原創)