【问题标题】:Django to pass through some urls to base apacheDjango 通过一些 url 传递给基础 apache
【发布时间】:2014-01-05 04:14:23
【问题描述】:

有没有办法让 Django 将一些 url 传递给任何 apache 也可以解决它们的方法?

例如,如果我输入:http://。有没有办法让 django 只提供 /var/www/html/index.html 中的任何内容?

同样,如果我输入 http:///devel,有没有办法让 django 简单地服务于 /var/www/html/devel/ 中的内容?

基本上,我希望一些网址“不被触摸”。

谢谢!

编辑 根据 Anentropic 的评论,我希望 Apache only 调用 Django,如果它不能匹配 url。我需要如何更改 httpd.conf 才能做到这一点?假设我希望 Django 只响应 /polls/、/admin/ 和 /accounts/。

这是我的 httpd conf 文件中的相关部分:

<VirtualHost *:80>
#DocumentRoot /home/ec2-user/srv/mysite
DocumentRoot /var/www/html/
ServerName <My IP ADDRESS>
WSGIScriptAlias / /home/ec2-user/srv/mysite/apache/wsgi.py



# Alias /phpmyadmin /var/www/html/phpmyadmin
# <Location /phpmyadmin>
#     SetHandler None
# </Location>
<Directory /home/ec2-user/srv/mysite/media>
    Order deny,allow
    Allow from all
</Directory>

<Directory /home/ec2-user/srv/mysite/apache>
    Order deny,allow
    Allow from all
</Directory>

LogLevel warn

Alias /media/ /home/ec2-user/srv/mysite/media/

Alias /static/ /home/ec2-user/srv/mysite/static/

<Directory /home/ec2-user/srv/mysite/static>
Order deny,allow
Allow from all
</Directory>

</VirtualHost>

【问题讨论】:

  • 你需要反过来做,让 Apache 首先尝试匹配/var/www/html 中的 URL,如果不匹配,则仅将 URL 传递给 django。
  • Burhan 说的:反过来做。通过 Django 提供服务是一个坏主意:Web 服务器是针对这种东西优化的,而不是 django。
  • @BurhanKhalid 是正确的 - 它是首先获取 url 的 Apache,在典型的 wsgi 设置中,它会将所有 url 传递给 Django ...您希望 Apache 对某些 url 做一些不同的事情,并且将其余部分传递给您的 Django 应用程序
  • @Yuji'Tomita'Tomita 的评论令人困惑,因为显然您将“通过 Django 提供服务” - Django 是您的 Web 应用程序,使用 Django 的唯一方法是让它提供服务。他的意思是“不要用 Django 提供静态文件”docs.djangoproject.com/en/dev/howto/static-files/deployment/…
  • @Anentropic:点了,但我如何让它首先尝试匹配 /var/www/html 中的 url,然后匹配 Django?如果有帮助,我把我的 httpd.conf 文件放上去?

标签: django apache


【解决方案1】:

如果您想提供静态 html 页面,可以使用 the flatpages app。 同样,如果您想使用不同的语言(php 等),我相信您必须在 apache 配置文件中设置不同的虚拟主机,以便在将 url 提供给 Django 并将其重定向到正确的文件夹之前捕获它。即:

<VirtualHost *:80>
ServerName  staging.mydomain.com
DocumentRoot /var/www/html/mydomain.com/staging/
</VirtualHost>

<VirtualHost *:80>
ServerName  dev.mydomain.com
DocumentRoot /var/www/html/mydomain.com/dev/
</VirtualHost>

编辑

<VirtualHost *:80>
#DocumentRoot /home/ec2-user/srv/mysite
DocumentRoot /var/www/html/
ServerName <My IP ADDRESS>

Alias /phpmyadmin /var/www/html/phpmyadmin
<Location /phpmyadmin>
     SetHandler None
</Location>
<Directory /home/ec2-user/srv/mysite/media>
Order deny,allow
Allow from all
</Directory>

<Directory /home/ec2-user/srv/mysite/apache>
Order deny,allow
Allow from all
</Directory>

LogLevel warn

WSGIScriptAlias /polls /home/ec2-user/srv/mysite/apache/wsgi.py
WSGIScriptAlias /admin /home/ec2-user/srv/mysite/apache/wsgi.py
WSGIScriptAlias /accounts /home/ec2-user/srv/mysite/apache/wsgi.py

Alias /media/ /home/ec2-user/srv/mysite/media/

Alias /static/ /home/ec2-user/srv/mysite/static/

<Directory /home/ec2-user/srv/mysite/static>
Order deny,allow
Allow from all
</Directory>

</VirtualHost>

【讨论】:

  • 我想做相反的事情,捕获指向 Django 的 url 并适当地重定向它们。如何仅使用上面的 httpd.conf 将 URL /polls/、/admin/ 和 /accounts/ 重定向到 Django?谢谢!
  • 我还在工作,所以我现在无法对其进行测试,但您可以在为 Django 定义 WSGIScriptAlias 之前尝试定义其他所有内容,然后将其映射到特定的 URI,例如:@987654324 @ 而不是 WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py 这应该对所有其他 url 进行查找,然后将其重定向到您的 django 应用程序。
  • 我以前试过。但是,当我到达 my-server-ip/polls 时,Django 会看到一条“”路径。它没有看到“民意调查”。
  • 我现在唯一能想到的就是在另一个别名下设置你的 Django 应用程序,这样你就可以通过 /foo 访问所有内容(即:foo/polls 或 foo/admin)。如果没有,您可以在 WSGIScript 之上设置别名,但是如果请求未知别名,它将退回到 Django。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
  • 2016-05-30
  • 2018-09-06
  • 1970-01-01
  • 2013-12-13
  • 1970-01-01
相关资源
最近更新 更多