【问题标题】:Static files are not served during production in Django. How to solve the issue?在 Django 的生产过程中不提供静态文件。如何解决问题?
【发布时间】:2019-12-10 07:08:02
【问题描述】:

我想在我的 Linux 服务器上部署一个 Django 应用程序。我遵循了 Django 文档,甚至还配置了 Apache 配置文件,但是在运行 Django 服务器时,我的 CSS 和 JS 文件都看不到:我的网站、Django 管理界面和 rest_framework。

这是我目前所做的:

在启动“collectstatic”命令后创建了一个“静态”文件夹,其中包含以下内容:

blog_app (my website)
rest_framework (my APIs)
admin (Default Django Admin interface)

settings.py:

DEBUG = False

[.] #all default settings

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/

STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'

REST_FRAMEWORK = {

    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],

    'DEFAULT_AUTHENTICATION_CLASSES' : [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ],
}

Apache 配置文件(我将其命名为“django_app.conf”):

ServerAdmin webmaster@localhost
DocumentRoot /var/www/html

#django_app is the root folder for my Django project
Alias /static /var/user/django_app/static
  <Directory /var/user/django_app/static>
    Require all granted
  </Directory>

  <Directory /var/user/django_app/django_app>
    <Files wsgi.py>
      Require all granted
    </Files>
  </Directory>

  WSGIScriptAlias / /var/user/django_app/django_app/wsgi.py
  WSGIDaemonProcess my_django_app python-path=/var/user/django_app python-home=/var/user/django_app/venv
  WSGIProcessGroup my_django_app

之后,我输入:

sudo a2ensite django.conf        #to allow my Apache config file instead of 000-default.conf

还有:

sudo a2dissite 000-default.conf  #to disallow original Apache2 config file

然后我为我的根项目文件夹添加了 www-data 用户权限:

sudo chown :www-data /var/user/django_app/    

我还为我的根 Django 项目添加了读、写和执行权限:

sudo chmod 775 /var/user/django_app/

在这之后,我执行了这个命令:

sudo service apache2 restart

最后,我在根文件夹中执行了 Django 服务器:

python3 manage.py runserver <IP Address>:8000

但是,当查看我的网站、Django 管理界面和 Django Rest Framework HTML 页面时,没有涉及到静态文件(缺少 CSS 和 JS 文件)。

谁能给我解释一下怎么回事?我错过了什么吗?

【问题讨论】:

    标签: django python-3.x apache2 web-deployment


    【解决方案1】:

    不要把它放在你的项目文件夹中,而是将它放在一个文件夹中,如图所示并在那里创建静态根文件夹和媒体文件夹,运行 collectstatic 命令。

    Alias /static /var/static-root
    <Directory /var/static-root>
       Require all granted
     </Directory>
    
    Alias /media /var/media-root
    <Directory /var/media-root>
       Require all granted
    </Directory>
    

    并在您的设置文件中进行一些更改

    STATIC_URL = '/static/'
    STATIC_ROOT = '/var/static-root/'
    MEDIA_URL = '/media/'
    MEDIA_ROOT = '/var/media-root/'
    

    【讨论】:

    • 谢谢你的回复,我试试这个。但是,只是一个疑问,我认为将静态文件夹放在根项目中是一种标准吗?遵循您的方法后,我应该更改静态文件夹的权限吗?
    • 对于媒体,您可能必须授予用户权限以防出错。
    • 我试过这个,但没有用。难道我不再需要访问 Django 服务器而只需使用 Apache 并在 URL 中插入 IP 地址吗?这就是网站仍然崩溃的原因吗?
    • 我已经在我的代码中包含了以下更新,但是静态 url 仍然没有指向所需的文件夹。
    • 你运行 collectstatic 命令?检查新的静态文件夹?那里有文件还是空的?
    猜你喜欢
    • 2018-09-25
    • 2011-08-11
    • 2017-12-30
    • 1970-01-01
    • 2017-10-27
    • 2016-12-10
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    相关资源
    最近更新 更多