我正在尝试在子域上部署我的django应用程序,例如example.djangoapp.com,一切正常,除了我的django管理站点,当我点击进入管理站点的链接时,它会路由到不同的网址。当我使用admin url模板标签时会发生这种情况,即它会路由到djangoapp.com/index而不是example.djangoapp.index.fcgi / login(这是管理站点)。
删除管理网址模板标签后,我将一个绝对网址重定向到管理网站,这工作正常,管理网站显示,但不提供其静态文件。所以我介于两者之间。
我正在部署在共享主机上运行fastcgi的服务器上
我的问题:
1)选项1(使用admin url模板标签):
如何让django将我重定向到正确的管理站点(www.example.djangoapp.index.fcgi / login),而不是将我重定向到(www.djangoapp.com/index)。
2)使用绝对网址时: 现在我在我的主页模板索引页面中硬编码了管理链接,这样可以正常工作,但是不提供django管理静态文件。他们怎么能得到服务?
原谅我的无知,但我已经挣扎了几个星期。我决定对网址进行硬编码,但仍未提供管理网站静态文件。
下面是我的settings.py,urls.py和index.html(其中我硬编码了管理站点网址)。此代码与上面的选项2内联,其中包含硬编码的管理站点URL。
settings.py
WSGI_APPLICATION = 'cconnect_web.wsgi.application'
# Database
# https://docs.djangoproject.com/en/1.8/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '',
'USER': '',
'PASSWORD': '',
'HOST': '',
'PORT': '',
'CONN_MAX_AGE': 3600,
}
}
# Internationalization
# https://docs.djangoproject.com/en/1.8/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'Africa/Cairo'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.8/howto/static-files/
STATIC_URL = '/cconnect/static/'
STATIC_ROOT = '/home4/techaven/public_html/cconnect/static'
FORCE_SCRIPT_NAME="/index.fcgi/"
Urls.py
from django.conf.urls import *
from django.conf.urls import include, url
from django.contrib import admin
from cconnect_frontEnd import views
from . import settings
#app_name = 'cconnect_frontEnd
urlpatterns = [
url(r'^$', views.index, name ='index'),
url(r'^backend/', include('Back_End.urls')),
url(r'^admin/', include(admin.site.urls)),
url(r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root':settings.STATIC_ROOT}),
]
urlpatterns += patterns('Back_End.views',
(r'^login/$', 'login_view'),
)
admin.site.site_header = 'Cconnect Administration.'
的index.html
<body>
<div class="header-wrapper">
<nav>
<div class=nav-wrapper">
{% load staticfiles %}
<img src="{% static "cconnect_frontEnd/images/slide/logo.png" %}" alt="Conference Connect"/>
<ul class="right hide-on-med-and-down">
{% load admin_urls %}
<li><a href="http://cconnect.techavenue137.rw/index.fcgi/admin">Sign In</a></li>
<li><a href="#feature-title">Features</a></li>
<li><a href="#demo-video">Videos</a></li>
</ul>
index.fcgi
import os
import sys
from flup.server.fcgi import WSGIServer
from django.core.wsgi import get_wsgi_application
sys.path.insert(0, "/home4/techaven/public_html/cconnect/cconnect_web/")
os.chdir("/home4/techaven/public_html/cconnect/cconnect_web")
os.environ['DJANGO_SETTINGS_MODULE'] = "cconnect_web.settings"
WSGIServer(get_wsgi_application()).run()
的.htaccess
AddHandler fcgid-script .fcgi
DirectoryIndex index.fcgi
RewriteEngine On
RewriteCond %{HTTP_HOST} ^cconnect\.techavenue137\.rw$ [OR]
RewriteCond %{HTTP_HOST} ^www\.cconnect\.techavenue137\.rw$
RewriteRule ^/?$ "http\:\/\/www\.techavenue137\.rw\/cconnect\/index\.fcgi" [R=301,L]
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /cconnect/
RewriteRule ^index\.fcgi$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
#RewriteCond %{REQUEST_URI} !^/static/
RewriteRule ^(.*)$ /cconnect/index.fcgi/$1 [L]
</IfModule>
感谢您的帮助,并再次原谅我的愚蠢问题。
答案 0 :(得分:1)
您需要添加重写规则,将浏览器请求重定向到管理页面的实际静态文件。 在上一次重写规则下方,添加以下行:
RewriteCond "%{REQUEST_URI}" ".*/static/admin/.*"
RewriteRule "(.*)/cconect/(.*)" "$1/index.fcgi/$2" [R, L]
此处,重写条件是,如果请求的URI包含/static/admin
,则将cconnect
替换为index.fcgi
并保持其他所有内容相同。将其标记为重定向[R]并在找到[L]时停止规则处理。我希望这能解决你的问题。
免责声明:我对正则表达式模式不是很熟悉,而且我对Apache有基本的了解,因此可能需要调整此解决方案。如果您需要调整它,请查看here。
答案 1 :(得分:0)
我通过移动其他主机完全解决了此问题,必须部署并使用快速cgi。我部署到Digital Oceans,并使用Nginx提供静态文件和媒体文件。