在django中訪問靜態檔案(js css img)

來源:互聯網
上載者:User

標籤:

剛開始參考的是別的文章,後來參考文章《各種 django 靜態檔案的配置總結》才看到原來沒有但是沒有注意到版本,折騰了一晚上,浪費了很多很多時間.後來終於知道搜尋django1.7訪問靜態檔案.真是傻×.

環境:
python 2.7.3
django 1.7.5

django是不善於處理靜態檔案這種事情的.這樣的工作要交給nginx或者apache這樣的伺服器.但是在調試時還是要配置一下的
django 1.7.5配置訪問靜態檔案貌似比其他的版本都要簡單一些.只需要如下步驟:

  1. 收集靜態檔案,然後放在app下的static中,目錄如下:
    iot_app├── admin.py├── admin.pyc├── forms.py├── forms.pyc├── __init__.py├── __init__.pyc├── migrations│   ├── 0001_initial.py│   ├── 0001_initial.pyc│   ├── 0002_auto_20150317_1623.py│   ├── 0002_auto_20150317_1623.pyc│   ├── __init__.py│   └── __init__.pyc├── models.py├── models.pyc├── static│   ├── css│   │   ├── bootstrap.css│   │   ├── bootstrap.css.map│   │   ├── bootstrap.min.css│   │   ├── bootstrap-theme.css│   │   ├── bootstrap-theme.css.map│   │   └── bootstrap-theme.min.css│   ├── fonts│   │   ├── glyphicons-halflings-regular.eot│   │   ├── glyphicons-halflings-regular.svg│   │   ├── glyphicons-halflings-regular.ttf│   │   ├── glyphicons-halflings-regular.woff│   │   └── glyphicons-halflings-regular.woff2│   ├── images│   │   ├── chrome.png│   │   ├── firefox.png│   │   ├── ie.png│   │   ├── opera.png│   │   └── safari.png│   └── js│       ├── bootstrap.js│       ├── bootstrap.min.js│       ├── html5shiv.js│       ├── html5shiv.min.js│       ├── jquery-1.11.1.js│       ├── jquery-1.11.1.min.js│       ├── jquery-1.11.1.min.map│       ├── jquery-1.11.2.min.js│       ├── jquery-1.11.2.min.map│       ├── npm.js│       └── respond.min.js├── templates│   ├── base.html│   ├── buttons.html│   ├── contact.html│   ├── form.html│   ├── form_inline.html│   ├── formset.html│   ├── form_using_template.html│   ├── index.html│   ├── login.html│   ├── pagination.html│   └── tabs.html├── tests.py├── views.py└── views.pyc
  2. 設定setting.py
    STATIC_URL = ‘/static/‘STATICFILES_DIRS = (    os.path.join(BASE_DIR, ‘static/‘),#    ‘/var/www/static‘,)
  3. 在模版中使用
    {% load staticfiles %} < img src = "{% static "img/test.jpg" %}" alt = "test"/>或者{% load staticfiles %} < link rel="stylesheet" href="{% static ‘css/header.css‘ %}" >

注意:

  • 確保setting.py中的INSTALL_APPS中包含django.contrib.staticfiles
  • 確保setting.py中的DEBUG選項為True,否則無法映射到靜態檔案目錄

在生產模式中不可設定為True哦,所以生產模式下的配置是不一樣的,下面使用nginx來配置靜態資源.
補充:
說明一下,有關幾個settings中設定的問題 static_root static_url staticfiles_dirs:

  1. settings.py中
    As for the static folder under myproject root, actually it doesn’t necessarily have to be there. As long as STATIC_ROOT (in settings.py) points to the same location. So what’s going on here is when you do:

     

    python manage.py collectstatic

    It will copy all the individual static folder to the STATIC_ROOT folder, that’s why in each of your app, you need to follow the naming convention like this:

    app_one/static/app_one/css

    You are not supposed to put stuff directly under the app’s static folder, which might cause name collisions when you collectstatic.
    也就是說.在執行collectstatic時,會自動的把每個app下的static檔案拷貝到static_root指定的路徑下.另外採用這樣的目錄格式app_one/static/app_one,這樣在有多個app的情況下.可以就不會因為有檔案名稱相同的檔案被覆蓋掉

  2. the STATIC_URL in the settings.py
    This url will appear in your browser:
    (BTW, make sure the URL ends with a slash/, without a slash it might work but very unstable, django will error out this in the log)

     

    # STATIC_URL = ‘/static/‘ # it doesn‘t have to thisSTATIC_URL = ‘/static/monkeyking/‘ # it can be anything

    You shouldn’t hardcode the img or css in your template something like:

    ... url = "/static/app_one/css/mycss.css" ... ... url = "../../static/app_one/img/logo.png" ... 

    In stead, you should do this in your template:

    {% load staticfiles %}< link rel="stylesheet" href="{% static "gl_pulltabs/css/foundation.css" %}" / >

    這個STATIC_URL的作用其實是:在settings.py中DEBUG和TEMPLATE_DEBUG都為開的情況下.只要在模版中像上面這樣使用,就會自動的在前面加上/static/.例如你想要請求的是/static/app_one/css/mycss.css,那麼如果你講STATIC_URL設定為/static/appone/,那麼你只要使用{% static “css/mycss.css” %}就可以了.

    在開發階段,Django把/static映射到django.contrib.staticfiles這個App。staticfiles自動地從STATICFILES_DIRS、STATIC_ROOT以及各個App的static子目錄裡面搜尋靜態檔案。一旦布署到開發環境上,settings.py不需要重新編寫,只要在Apache的設定檔裡面寫好映射,/static將會被Apache處理。django.contrib.staticfiles雖然仍然存在,但因為不會接收到以/static/開始的路徑,所以將不會產生作用。不必擔心Django會使用處理速度變慢。另外,當settings.DEBUG is False的時候,staticfiles將自動關閉

  3. STATICFILES_DIRS
    Here, in settings.py again, you need to explicitly tell django where else to look for static files:

     

    STATICFILES_DIRS = ("/path/to/your/project/yourapp/static/",...)

    Can you put your deploy static folder(STATIC_ROOT) path to here, so you can save some disk space? No, you cannot! django won’t allow it.

在django中訪問靜態檔案(js css img)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.