无法在Django app

时间:2018-06-09 11:31:12

标签: django python-2.7 django-staticfiles

我在googlecloud VM(Ubuntu 16.04)中安装了一个带有静态IP的django应用程序(1.8.19)但是当我访问该页面时,我无法正确加载所有静态文件(css,jquery等)。 虽然我在apache conf文件中设置了正确的文件路径,但URL无法包含“静态”部分。 所以不是这样:

http://myip/**static**/lib/css/assets.min.css

他们是这样的:

http://myip/lib/css/assets.min.css

因此一切都无法正确呈现,我在webdeveloper中遇到以下错误:

enter image description here

我认为问题必须在settings.py文件中的某处,但我不确定在哪里我明确定义静态文件夹的路径:

  MEDIA_ROOT = '/var/www/geonode/uploaded'
  STATIC_ROOT = '/var/www/geonode/static/'


  TEMPLATE_DIRS = (
    '/etc/geonode/templates',
    os.path.join(GEONODE_ROOT, 'templates'),
  )
  # Additional directories which hold static files
  STATICFILES_DIRS = [
    '/etc/geonode/media',
    os.path.join(GEONODE_ROOT, 'static'),
  ]

修改

这是我在启用网站的文件夹中的apache conf文件:

    WSGIDaemonProcess geonode user=www-data threads=15 processes=2
<VirtualHost *:80>
    Servername localhost
    ServerAdmin webmaster@localhost
    LimitRequestFieldSize 32760
    LimitRequestLine 32760
    ErrorLog /var/log/apache2/error.log
    LogLevel warn
    CustomLog /var/log/apache2/access.log combined
    WSGIProcessGroup geonode
    WSGIPassAuthorization On
    WSGIScriptAlias / /var/www/geonode/wsgi/geonode.wsgi
    <Directory "/var/www/geonode/">
       Order allow,deny
       Options -Indexes
       Allow from all
    </Directory>
    Alias /static/ /var/www/geonode/static/
    Alias /uploaded/ /var/www/geonode/uploaded/
    Alias /robots.txt /var/www/geonode/robots.txt
    <Directory "/var/www/geonode/uploaded/documents/">
       Order allow,deny
       Deny from all
    </Directory>
    <Directory "/var/www/geonode/uploaded/layers/">
       Order allow,deny
       Deny from all
    </Directory>

 <Directory "/var/www/geonode/static_root/">
        Order allow,deny
        Options Indexes FollowSymLinks
        Allow from all
        Require all granted
        IndexOptions FancyIndexing
    </Directory>

    <Directory "/var/www/geonode/uploaded/thumbs/">
        Order allow,deny
        Options Indexes FollowSymLinks
        Allow from all
        Require all granted
        IndexOptions FancyIndexing
    </Directory>

    <Directory "/var/www/geonode/uploaded/avatars/">
        Order allow,deny
        Options Indexes FollowSymLinks
        Allow from all
        Require all granted
        IndexOptions FancyIndexing
    </Directory>

    <Directory "/var/www/geonode/uploaded/people_group/">
        Order allow,deny
        Options Indexes FollowSymLinks
        Allow from all
        Require all granted
        IndexOptions FancyIndexing
    </Directory>

    <Directory "/var/www/geonode/uploaded/group/">
        Order allow,deny
        Options Indexes FollowSymLinks
        Allow from all
        Require all granted
        IndexOptions FancyIndexing
    </Directory>

<Proxy *>
      Order allow,deny
      Allow from all
    </Proxy>

    ProxyPreserveHost On
    ProxyPass /geoserver http://localhost:8080/geoserver
    ProxyPassReverse /geoserver http://localhost:8080/geoserver
</VirtualHost>

编辑II

我的local_settings.py中的STATIC_URL:

    STATIC_URL = '/static/'

The template of base.html:

{% load i18n avatar_tags %}
{% load account socialaccount %}
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <meta Http-Equiv="Cache-Control" Content="no-cache">
    <meta Http-Equiv="Pragma" Content="no-cache">
    <meta Http-Equiv="Expires" Content="0">
    <meta Http-Equiv="Pragma-directive: no-cache">
    <meta Http-Equiv="Cache-directive: no-cache">

    <title>{% block title %}{{ SITE_NAME }}{% endblock %}</title>
    {% block head %}
      {% if DEBUG_STATIC %}
          <link href="{{ STATIC_URL }}lib/css/jquery.dataTables.css?v={{ VERSION }}" rel="stylesheet" />
          <link href="{{ STATIC_URL }}lib/css/select2.css?v={{ VERSION }}" rel="stylesheet"/>
          <link href="{{ STATIC_URL }}lib/css/bootstrap.min.css?v={{ VERSION }}" rel="stylesheet"/>
          <link href="{{ STATIC_URL }}lib/css/jquery-ui.css?v={{ VERSION }}" rel="stylesheet"/>
      {% else %}
        <link href="{{ STATIC_URL }}lib/css/assets.min.css?v={{ VERSION }}" rel="stylesheet"/>
      {% endif %}

      <link href="{{ STATIC_URL }}geonode/css/ext-compatibility.css?v={{ VERSION }}" rel="stylesheet" />
      <link href="{{ STATIC_URL }}geonode/css/ux-all.css?v={{ VERSION }}" rel="stylesheet" />
      <link href="{{ STATIC_URL }}geonode/css/base.css?v={{ VERSION }}" rel="stylesheet" />
      <style type="text/css">[ng\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}</style>
{% block extra_head %}
      {% endblock %}
    {% endblock %}
    <!--[if IE]>
      <script src="https://html5shim.googlecode.com/svn/trunk/html5.js"></script>
      <style>
        #ieflag{
            display: block !important;
            height: 150px;
            text-align: center;
        }
      </style>
    <![endif]-->
    <link rel="search" type="application/opensearchdescription+xml" href="/catalogue/opensearch" title="GeoNode Search"/>
  </head>

  <body class="{% block body_class %}{% endblock %}">
    <!-- Navbar -->
    {% block header %}
        <nav class="navbar navbar-inverse navbar-fixed-top" role="navigation">
          <div class="container">
        <div class="navbar-header">
              <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
                <i class="fa fa-navicon fa-lg"></i>
</button>
              <a class="navbar-brand" href="{% url "home" %}">GeoNode</a>
            </div>
            <div id="navbar" class="navbar-collapse collapse">
              <ul class="nav navbar-nav toolbar">
                {% block tabs %}
                <li id="nav_layers">
              <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">{% trans "Data" %}<i class="fa fa-angle-down fa-lg"></i></a>
              <ul class="dropdown-menu">
                <li><a href="{% url "layer_browse" %}?limit={{ CLIENT_RESULTS_LIMIT }}">{% trans "Layers" %}</a></li>
                <li><a href="{% url "document_browse" %}?limit={{ CLIENT_RESULTS_LIMIT }}">{% trans "Documents" %}</a></li>
                {% if user.is_authenticated %}
                <li><a href="{% url "services" %}?limit={{ CLIENT_RESULTS_LIMIT }}">{% trans "Remote Services" %}</a></li>
                <li role="separator" class="divider"></li>
                <li><a href="{% url "layer_upload" %}">Upload Layer</a></li>
                {% if 'geonode.contrib.createlayer' in INSTALLED_APPS %}
                  <li><a href="{% url "layer_create" %}">{% trans "Create Layer" %}</a></li>
                {% endif %}
                <li><a href="{% url "document_upload" %}">Upload Document</a></li>
                <li><a href="{% url "register_service" %}">{% trans "Add Remote Service" %}</a></li>
                {% endif %}
              </ul>
            </li>
                <li id="nav_maps">
              {% if user.is_authenticated %}
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">{% trans "Maps" %}<i class="fa fa-angle-down fa-lg"></i></a>
              <ul class="dropdown-menu">
                <li><a href="{% url "maps_browse" %}?limit={{ CLIENT_RESULTS_LIMIT }}">{% trans "Explore Maps" %}</a></li>
                <li> <a href="{% url "new_map" %}">{% trans "Create Map" %}</a></li>
              </ul>
              {% else %}
              <a href="{% url "maps_browse" %}?limit={{ CLIENT_RESULTS_LIMIT }}">{% trans "Maps" %}</a>
              {% endif %}
            </li>
            <li>
              <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">{% trans "About" %}<i class="fa fa-angle-down fa-lg"></i></a>
              <ul class="dropdown-menu">
                <li><a href="{% url "profile_browse" %}">{% trans "People" %}</a></li>
                <li><a href="{% url "group_list" %}">{% trans "Groups" %}</a></li>
                <li><a href="{% url "group_category_list" %}">{% trans "Group Categories" %}</a></li>
                {% if perms.announcements.can_manage %}
                <li><a href="{% url "announcements_list" %}">{% trans "Announcements" %}</a></li>
                {% endif %}
                <li role="separator" class="divider"></li>
                <li><a href="{% url "geonode.invitations:geonode-send-invite" %}">{% trans "Invite Users" %}</a></li>
                {% if user.is_superuser %}
                <li><a href="/admin/people/profile/add/">{% trans "Add User" %}</a></li>
                <li><a href="{% url "group_create" %}">{% trans "Create Group" %}</a></li>
                {% endif %}
              </ul>
            </li>

            {% block extra_tab %}
            {% endblock %}
            {% endblock %}
          </ul>
              <ul class="nav navbar-nav navbar-right">
<li>
              <div class="search">
                <form id="search" action="{% url "search" %}" >
                  <span class="fa fa-search"></span>
                  {% if HAYSTACK_SEARCH %}
                  <input id="search_input" type="text" placeholder="Search" name="q">
                  {% else %}
                  <input id="search_input" type="text" placeholder="Search" name="title__icontains">
                  {% endif %}
                </form>
              </div>
                </li>
            {% if not user.is_authenticated and ACCOUNT_OPEN_SIGNUP %}
            <li><a href="{% url "account_signup" %}">{% trans "Register" %}</a></li>
            {% endif %}
            {% if user.is_authenticated %}
            <li>
              <a href="#" class="dropdown-toggle avatar" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
                {% autoescape off %}{% avatar user 42 %}{% endautoescape %}
                {% with full_name=user.first_name|add:' '|add:user.last_name %}
                  {% if full_name.strip %}
                    {{ full_name | truncatechars:20 }}
                  {% else %}
                    {{ user.username | truncatechars:20 }}
                  {% endif %}
                {% endwith %}
                <i class="fa fa-angle-down fa-lg"></i>
              </a>
              <ul class="dropdown-menu">
                <li><a href="{{ user.get_absolute_url }}">{% trans "Profile" %}</a></li>
                <li><a href="{% url "recent-activity" %}">{% trans "Recent Activity" %}</a></li>
                <li><a href="{% url "messages_inbox" %}">{% trans "Inbox" %}</a></li>
                <li role="separator" class="divider"></li>
                <li><a href="{% url "admin:index" %}">Admin</a></li>
                {% if 'geonode.geoserver' in INSTALLED_APPS %}
 <li><a href="{% url "proxy" %}?url={{ GEOSERVER_LOCAL_URL }}web">GeoServer</a></li>
                {% endif %}
                {% if user.is_superuser and USE_MONITORING %}
                <li role="separator" class="divider"></li>
                <li><a href="{% url "monitoring:index" %}">{% trans "Monitoring" %}</a></li>
                {% endif %}
                <li role="separator" class="divider"></li>
                <li><a href="{% url "help" %}">{% trans "Help" %}</a></li>
                <li role="separator" class="divider"></li>
                <li><a href="/account/logout/">Logout</a></li>
                </ul>
              </li>
                      {% else %}
                      <li><a href="#" data-toggle="modal" data-target="#SigninModal" role="button" >{% trans "Sign in" %} </a></li>
              {% endif %}
            </ul>
          </div> <!--/.nav-collapse -->
        </div>
      </nav>
      {% endblock header %}
      <!-- End of Navbar -->

    <div class="alert alert-danger alert-dismissible" role="alert" id="ieflag" style="display:none">
      <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>
      <h1>You are using an outdated browser that is not supported by GeoNode.</h1>
      <p>Please use a <strong>modern browser</strong> like Mozilla Firefox, Google Chrome or Safari.</p>
    </div>

  <div id="wrap">
    {% block middle %}
    <div class="container">
      {% include "_status_message.html" %}
      {% include "_announcements.html" %}
 {% include "_messages.html" %}
      {% block body_outer %}
      <div class="row">
        <div class="col-md-8">
        {% block body %}{% endblock %}
        </div>
        <div class="col-md-4">
        {% block sidebar %}{% endblock %}
        </div>
      </div>
      {% endblock %}
    </div>
    {% endblock middle %}
  </div>

  {% block monitoring %}
  {% endblock %}

  {% block footer %}
  <footer>
    <div class="container">
      <div class="row">
        <div class="col-md-2">
          <ul class="list-unstyled">
            <li>Data</li>
            <li><a href="{% url "layer_browse" %}?limit={{ CLIENT_RESULTS_LIMIT }}">{% trans "Layers" %}</a></li>
            <li><a href="{% url "document_browse" %}?limit={{ CLIENT_RESULTS_LIMIT }}">{% trans "Documents" %}</a></li>
            {% if user.is_authenticated %}
            <li><a href="{% url "services" %}?limit={{ CLIENT_RESULTS_LIMIT }}">{% trans "Remote Services" %}</a></li>
            <li><a href="{% url "layer_upload" %}">Upload Layer</a></li>
            {% if 'geonode.contrib.createlayer' in INSTALLED_APPS %}
              <li><a href="{% url "layer_create" %}">{% trans "Create Layer" %}</a></li>
            {% endif %}
            <li><a href="{% url "document_upload" %}">Upload Document</a></li>
            <li><a href="{% url "register_service" %}">{% trans "Add Remote Service" %}</a></li>
            {% endif %}
</ul>
        </div>
        <div class="col-md-2">
          <ul class="list-unstyled">
            <li>Maps</li>
            <li><a href="{% url "maps_browse" %}?limit={{ CLIENT_RESULTS_LIMIT }}">{% trans "Explore Maps" %}</a></li>
            {% if user.is_authenticated %}
            <li> <a href="{% url "new_map" %}">{% trans "Create Map" %}</a></li>
            {% endif %}
          </ul>
        </div>
                <div class="col-md-2">
          <ul class="list-unstyled">
            <li>About</li>
            <li><a href="{% url "profile_browse" %}">{% trans "People" %}</a></li>
            <li><a href="{% url "group_list" %}">{% trans "Groups" %}</a></li>
            {% if perms.announcements.can_manage %}
            <li><a href="{% url "announcements_list" %}">{% trans "Announcements" %}</a></li>
            {% endif %}
            <li><a href="{% url "geonode.invitations:geonode-send-invite" %}">{% trans "Invite Users" %}</a></li>
            {% if user.is_superuser %}
            <li><a href="/admin/people/profile/add/">{% trans "Add User" %}</a></li>
            <li><a href="{% url "group_create" %}">{% trans "Create Group" %}</a></li>
            {% endif %}
          </ul>
        </div>
        <div class="col-md-6 text-right">
          <ul class="list-unstyled">
            <li>{% trans "Powered by" %} <a href="http://geonode.org">{% trans "GeoNode" %}</a> <em>{% trans "version" %} {{ VERSION }}</em></li>
            <li><a href="{% url "developer" %}">{% trans "Developers" %}</a> | <a href="{% url "about" %}">{% trans "About" %}</a><li>
          </ul>
          <label class="hidden">{% trans "Language" %}</label>
          {% if csrf_token != "NOTPROVIDED" %}
          {% get_current_language as LANGUAGE %}
          <form class="form-inline" action="/i18n/setlang/" method="post">
          {% csrf_token %}
            <select class="col-md-6 pull-right" name="language" onchange="javascript:form.submit()">
              {% for lang in LANGUAGES %}
              <option value="{{ lang.0 }}" {% ifequal LANGUAGE_CODE lang.0 %} selected="selected"{% endifequal %}>
                {{ lang.1 }}
 </option>
              {% endfor %}
            </select>
          </form>
          {% endif %}
        </div>
      </div>
    </div>
  </footer>
  {% endblock footer %}


    <!-- Modal must stay outside the navbar -->
    {% if not user.is_authenticated %}
    <div class="modal fade" id="SigninModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
      <div class="modal-dialog modal-sm">
        <div class="modal-content">
          <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
            <h4 class="modal-title" id="myModalLabel">{% trans "Sign in" %}</h4>
          </div>
          <form class="form-signin" role="form" action="{% url "account_login" %}?next={{ request.path }}" method="post">
            <div class="modal-body">
              {% csrf_token %}
              {% get_providers as socialaccount_providers %}
              {% if socialaccount_providers %}
                  {% include "socialaccount/snippets/provider_list.html" with process="login" %}
                  {% include "socialaccount/snippets/login_extra.html" %}
                <hr>
              {% endif %}
              <div class="form-group">
                <label for="id_username" class="sr-only">{% trans "Username" %}:</label>
                <input id="id_username" class="form-control" name="login" placeholder="{% trans "Username" %}" type="text" />
              </div>
 <div class="form-group">
                <label for="id_password" class="sr-only">{% trans "Password" %}:</label>
                <input id="id_password" class="form-control" name="password" placeholder="{% trans "Password" %}" type="password" />
              </div>
              <label class="checkbox">
                <input type="checkbox" /> {% trans "Remember Me" %}
              </label>
            </div>
            <div class="modal-footer">
              <button type="submit" class="btn btn-primary btn-block">{% trans "Sign in" %}</button>
            </div>
          </form>
        </div>
      </div>
    </div>
    {% endif %}
    <!-- End of Modal -->

    {% if DEBUG_STATIC %}
    <script src="{{ STATIC_URL }}lib/js/jquery.min.js?v={{ VERSION }}"></script>
    <script src="{{ STATIC_URL }}lib/js/jquery.dataTables.js?v={{ VERSION }}"></script>
    <script src="{{ STATIC_URL }}lib/js/jquery.timeago.js?v={{ VERSION }}"></script>
    <script src="{{ STATIC_URL }}lib/js/jquery.ajaxprogress.js?v={{ VERSION }}"></script>
    <script src="{{ STATIC_URL }}lib/js/jquery.ajaxQueue.js?v={{ VERSION }}"></script>
    <script src="{{ STATIC_URL }}lib/js/jquery-ui.custom.js?v={{ VERSION }}"></script>
    <script src="{{ STATIC_URL }}lib/js/jquery.raty.js?v={{ VERSION }}"></script>
    <script src="{{ STATIC_URL }}lib/js/bootstrap.min.js?v={{ VERSION }}"></script>
    <script src="{{ STATIC_URL }}lib/js/moment-with-locales.min.js?v={{ VERSION }}"></script>
    <script src="{{ STATIC_URL }}lib/js/bootstrap-datetimepicker.min.js?v={{ VERSION }}"></script>
    <script src="{{ STATIC_URL }}lib/js/json2.js?v={{ VERSION }}"></script>
    <script src="{{ STATIC_URL }}lib/js/select2.js?v={{ VERSION }}"></script>
    <script src="{{ STATIC_URL }}lib/js/waypoints.js?v={{ VERSION }}"></script>
    {% else %}
    <script src="{{ STATIC_URL }}lib/js/assets.min.js?v={{ VERSION }}"></script>
    {% endif %}
<script src="{{ STATIC_URL }}geonode/js/utils/utils.js?v={{ VERSION }}"></script>
    <script src="{{ STATIC_URL }}geonode/js/base/base.js?v={{ VERSION }}"></script>
    {% include 'autocomplete_light/static.html' %}
    <script type="text/javascript" src="{% url "javascript-catalog" %}"></script>
    {% block extra_script %}{% endblock extra_script %}
    <script type="text/javascript">
        var autocomplete = $('#search_input').yourlabsAutocomplete({
            url: '{% url "autocomplete_light_autocomplete" "ResourceBaseAutocomplete" %}',
            choiceSelector: 'span',
            hideAfter: 200,
            minimumCharacters: 1,
            placeholder: '{% trans 'Type your search here ...' %}',
            appendAutocomplete: $('#search_input'),
            autoHilightFirst: false
        });
        $('#search_input').bind('selectChoice', function(e, choice, autocomplete) {
            if(choice[0].children[0] == undefined) {
                $('#search_input').val($(choice[0]).text());
                $('#search').submit();
            }
        });
    </script>
    <script>
        // Workaround to fix the autocomplete box positions
        yourlabs.Autocomplete.prototype.fixPosition = function(html) {
            this.input.parents().filter(function() {
                return $(this).css('overflow') === 'hidden';
            }).first().css('overflow', 'visible');
            if(this.input.attr('name') !== 'resource-keywords'){
              this.box.insertAfter(this.input).css({top: 28, left: 0});
            }else{
              var pos = $.extend({}, this.input.position(), {
                height: this.input.outerHeight()
              });
              this.box.insertAfter(this.input).css({top: pos.top + pos.height, left: pos.left});
            }
        };
    </script>
    <script type="text/javascript" src="{% url "lang" %}"></script>
<div class="modal fade" style="width: 100%; height: 100%;" id="_resource_uploading" data-backdrop="static" data-keyboard="false" aria-hidden="true">
        <div class="modal-dialog">
            <div class="modal-content">
                <div class="modal-header">
                    <h1>Uploading...</h1>
                </div>
                <div class="modal-body">
                    <div class="progress">
                      <div class="progress-bar progress-bar-info progress-bar-striped active" role="progressbar" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" style="width:100%">
                        Upload in progress...
                      </div>
                    </div>
                </div>
            </div>
        </div>
    </div>

    <div class="modal fade" style="width: 100%; height: 100%;" id="_thumbnail_processing" data-backdrop="static" data-keyboard="false" aria-hidden="true">
        <div class="modal-dialog">
            <div class="modal-content">
                <div class="modal-header">
                    <h1>Processing...</h1>
                </div>
                <div class="modal-body">
                    <div class="progress">
                      <div class="progress-bar progress-bar-info progress-bar-striped active" role="progressbar" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" style="width:100%">
                        Updating Thumbnail...
                      </div>
                    </div>
                </div>
            </div>
</div>
    </div>

    <div class="modal fade" id="_thumbnail_feedbacks" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
      <div class="modal-dialog" role="document">
        <div class="modal-content">
          <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
            <h4 class="modal-title" id="exampleModalLabel">Message box</h4>
          </div>
          <div class="modal-body">
            ...
          </div>
          <div class="modal-footer">
            <button type="button" class="btn btn-default" data-dismiss="modal">OK</button>
          </div>
        </div>
      </div>
    </div>
  </body>
</html>

2 个答案:

答案 0 :(得分:1)

您还没有做任何事情来使模板中的STATIC_URL变量可用,因此它被评估为空字符串。

有多种方法可以执行此操作,但最简单的方法是将django.template.context_processors.static添加到TEMPLATES设置中的context_processors列表中。

或者您可以在模板顶部拨打{% get_static_prefix as STATIC_URL %}

或者,除STATIC_URL模板标记外,不要使用{% static %}

<link href="{% static "lib/css/jquery.dataTables.css" %}?v={{ VERSION }}" rel="stylesheet" />

答案 1 :(得分:0)

如果您认为一切正常,请在settings.py中添加以下代码

STATIC_URL = '/static/'
MEDIA_URL = '/media/'

然后在urls.py中添加以下代码

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += static(settings.STATIC_ROOT, document_root=settings.STATIC_ROOT)