python - 如何使用 Django 在 apache 服务器上修复 403 forbidden?

标签 python django apache ubuntu

当我尝试访问我的网站时出现以下错误:

禁止。您无权访问此服务器上的/。

我的虚拟主机文件如下所示:

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined


        Alias /static ~/myproject/static

        <Directory ~/myproject/static>
                Require all granted
        </Directory>

        <Directory ~/myproject/myprojectapi>
                Order allow,deny
                Require all granted
                <Files wsgi.py>
                        Require all granted
                </Files>
        </Directory>
</VirtualHost>

而我的 apache2.conf 是默认文件。我在 Ubuntu 14.04 上使用 Django 1.9 和 Python 2.7

我实际上已经尝试了大多数(如果不是全部的话)在网站上找到的解决方案,但由于某种原因,它们都不起作用。我关注了this教程并授予以下权限:

chmod 664 ~/myproject/db.sqlite3

sudo chown :www-data ~/myproject/db.sqlite3

sudo chown :www-data ~/myproject

我也以 root 用户身份操作。

如果您需要任何其他信息,请告诉我;我会非常乐意提供它。任何帮助将不胜感激。

这是 WSGI 行:

 WSGIDaemonProcess goggest python-path=~/myproject:/usr/lib/python2.7/dist-packages
        WSGIProcessGroup goggest
        WSGIScriptAlias / ~/myproject/myprojectapi/wsgi.py

最佳答案

下面是我如何解决(在很多帮助下)这个问题。 此答案假定您具有以下项目结构:

~/myproject
    - myproject
      - ...
      - settings.py
      - wsgi.py
    - myapp
      - ...
      - static
        - myapp
          - ...

题外话

我遇到的问题是我的 apahce error.log 中出现错误,提示找不到 settings。此问题很可能是由您的 python 路径中的错误引起的。这部分假设您使用的是守护进程方法(文档推荐)。

  1. 检查您的 wsgi.py 文件并确保它显示的是 myproject.settings 而不是 os.environ.setdefault 中的 settings ("... ", "... ")
  2. 检查并仔细检查您的 python 路径,它应该类似于 WSGIDaemonProcess [任意名称] python-path=/home/[用户名]/myproject:/usr/lib/python2.7/site-packages

这应该可以解决问题(至少对我来说是这样)。

修复 403 Forbidden(或者至少绕过它)

以下是为我完成这项工作的conf。它不是 apache2.conf 并且我的apache2.conf 中没有任何,它仍然是默认的.以下内容在 apache2/sites-available/000-default.conf 中。

<VirtualHost *:80>
        ServerAdmin webmaster@localhost

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        DocumentRoot /home/[username]/myproject # (1)

        Alias /static path/to/your/static_root    # (2)

        <Directory path/to/your/static_root>
                Require all granted
        </Directory>

        <Directory /home/[username]/myproject/myproject>
            Options Indexes FollowSymLinks Includes ExecCGI
            AllowOverride All
            Order allow,deny
            Allow from all
            Require all granted
        </Directory>

        <Directory /home/[username]/myproject/myproject>
                <Files wsgi.py>
                        Require all granted
                </Files>
        </Directory>

        WSGIDaemonProcess [any-name] python-path=/home/[username]/myproject:/usr/lib/python2.7/site-packages
        WSGIProcessGroup [any-name]
        WSGIScriptAlias / /home/[username]/[myproject]/[myproject]/wsgi.py

        WSGIApplicationGroup %{GLOBAL}

</VirtualHost>

回复:要点 (1), (2)

(1)。将文档根目录更改为包含您的 Django 项目文件的目录的头部。在这种情况下,我将其更改为 /home/[username]/myproject不要使用~/作为引用。我试过了,但似乎没有成功。

(2)。如果您从同一台服务器提供静态文件,请确保您已在 settings.py 文件中设置了 STATIC_ROOTSTATIC_URL。在我的例子中,我将 STATIC_URL 设置为 /static/ 并将 STATIC_ROOT 设置为 /var/www/[any-name]/static/。当您决定部署时,您将必须运行 sudo python manage.py collectstatic

另请注意,它应该是 Alias/static 而不是 Alias/static/(注意结尾的斜杠)。文档显示 /static/ 但这是不正确的,并且在您尝试提供静态文件时不起作用(apache 未完成路径)。

就是这样。所有这些步骤都让我的服务器启动并运行。如果您有任何问题,请随时发表评论,我会尽力提供帮助。祝你好运!

关于python - 如何使用 Django 在 apache 服务器上修复 403 forbidden?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38231133/

相关文章:

mysql - Django 管理员通过将拉丁字母视为立陶宛字母来进行搜索

linux - Apache2 ErrorLog 意外行为

python - Hackerrank.com 井字游戏挑战

python - 在每个数据库查询中调用 Django to_python 函数

python - 为什么 pow(a, d, n) 比 a**d % n 快这么多?

django - 在 Form Meta 类中设置初始值

apache - 重写规则案例 "Internal server error"(里面的 error.log)

PHP Apache 增加每个客户端的最大并发连接数

python - 如何拆分具有相同分隔符的列

python - 如何在 Windows 上的 python 中测试子进程的 stdout、stderr