• <input id="oe200"></input>
  • <menu id="oe200"></menu>

    Django下MEDIA_ROOT, MEDIA_URL, STATIC_ROOT, STATIC_URL詳解

    時間:2022-01-20 16:22:02 類型:python
    字號:    

      Django中settings中的四個設置參數的一些故事:

      MEDIA_ROOT, MEDIA_URL, STATIC_ROOT, STATIC_URL

      1、MEDIA_ROOT與MEDIA_URL

      事實上MEDIA_ROOT和MEDIA_URL代表的是用戶上傳后的文件一般保存的地方。我的理解是,可變文件的文件夾。

      與這兩個參數有聯系的,是在Django的FileField和ImageField這樣的Model類中,有upload_to參數可選。當upload_to設置相關的地址后,如:upload_to="username";文件上傳后將自動保存到 os.path.join(MEDIA_ROOT, upload_to)。

      而MEDIA_URL,,則代表用戶通過URL來訪問這個本地地址的URL。如本機http://127.0.0.1/, MEDIA_URL設置為"/site_media/",那么通過http://127.0.0.1/site_media/*** 就可以訪問相關的上傳圖片或者其他資源。

      2、STATIC_ROOT與STATIC_URL

      STATIC_ROOT和STATIC_URL則是網站中,用于網站顯示的靜態圖片、CSS、JS等文件的保存地址。我的理解是,運行中不會再變文件的文件夾(即不會刪除或者新增)

      2.1 STATIC_URL

      同MEDIA_URL類似;STATIC_URL為"/static/"時候,通過http://127.0.0.1/static/***就可以訪問相關的靜態文件了。

      2.2 STATIC_ROOT

      STATIC_ROOT是一個比較特殊的文件夾。這是區別Django的開發模式和部署模式下最大的地方了。

      通常我們在開發模式下,可以在我們所在的project下建立相應的app, 然后每個app下都建立相應的static文件夾。在開發模式下(Debug=True),Django將為我們自動查找這些靜態文件(每個app)并在網頁上顯示出來。然而,在部署模式下,Django認為這些工作交由web服務器來運行會更有效率。

      因此,在部署時,我們需要運行一下python manage.py collectstatic 這個命令。這個命令將會把每個app里的static目錄下的文件copy到STATIC_ROOT這個文件夾下,這時候如果在部署模式下(Debug=False),網頁中相關的,如: http://127.0.0.1/static/*** 的訪問,將不會訪問Django下各個App中的static,而是STATIC_ROOT中所指定的文件夾。

      3、Debug=False后,為何無法訪問圖片和js等文件了?

      其實這個問題,是在于web服務器沒有對STATIC_ROOT以及MEDIA_ROOT這兩個文件夾進行映射所導致的。

      以apache為例,假定:

      STATIC_ROOT="/home/user/static/"

      STATIC_URL="/static/"

      MEDIA_ROOT="/home/user/media/"

      MEDIA_URL="/media/"

      那么可以在apache的配置文件中,增加以下:

    <Location "/static/">
    Order deny,allow
    Allow from all
    Satisfy Any
    </Location>
    Alias /static/ "/home/user/static"
    <Location "/media/">
    Order deny,allow
    Allow from all
    Satisfy Any
    </Location>
    Alias /media/ "/home/user/media/"

      4、開發模式中,MEDIA_ROOT和MEDIA_URL問題

      在開發模式下,我們有時候會發現http://127.0.0.1/media/下無法訪問我們上傳的文件。在Django最新的版本中,可以在url中增加相關的映射來解決,在你的urlpatterns后面增加:

     

      配合下面的方式使用才能訪問到文件,大家看到+static()的方式也相當于是通過static靜態文件訪問的形式來訪問文件。那么就可以直接配置在settings中

     media_root = os.path.join(settings.BASE_DIR,settings.MEDIA_ROOT)
    urlpatterns += static(settings.MEDIA_URL, document_root = media_root)


    亚洲色欲色欲在线大片
  • <input id="oe200"></input>
  • <menu id="oe200"></menu>
    <