我目前在Apache服務器上託管我的Django站點。 Django網站在本地託管時工作正常,但是當我嘗試導航到網站的其他部分時,從服務器託管它時出現錯誤。就目前而言,您可以通過導航到example.com/djproj
進入主頁,這樣會彈出登錄屏幕。當你輸入你的憑證並點擊提交按鈕時,它會將你帶到example.com
這不受支持,但是如果你手動導航回到example.com/djproj
它會將你帶到主屏幕並且你已經登錄,點擊任何按鈕都會給你一個類似的錯誤。值得注意的是,如果您嘗試通過直接輸入支持的url(url文件中的一個),即example.com/djproj/precheck/
,您將得到一個404,說明請求URL是example.com//precheck/
。Apache上的Django重定向不正確
我會嘗試提供我認爲適用的腳本,但是如果我錯過了一些我很樂意提供的內容。
文件結構看起來像/var/www/html/djproj/cif
,其中cif
包含所有典型的django文件,例如manage.py
和相關的應用程序文件夾。
wsgi.py
import os, sys
from django.core.wsgi import get_wsgi_application
path = 'var/www/djproj/grip/cif'
if path not in sys.path:
sys.path.append(path)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "grip.settings")
application = get_wsgi_application()
urls.py
from django.conf.urls import url, include
from django.contrib import admin
from django.conf import settings
from django.conf.urls.static import static
from precheck import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^accounts/', include('accounts.urls')),
url(r'^precheck/', include('precheck.urls')),
url(r'^[/]?$', views.upload, name = 'home'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
的httpd.conf(適用的部分)
WSGIScriptAlias /djproj/ /var/www/html/djproj/cif/grip/wsgi.py process-group=16$
WSGIPythonPath /var/www/html/djproj/
<Directory /var/www/html/djproj/cif/grip>
<Files wsgi.py>
Order deny,allow
Allow from all
</Files>
</Directory>
編輯:在評論中嘗試建議。
我改變了網址爲以下:
urls.py
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^djproj/accounts/', include('accounts.urls')),
url(r'^djproj/*precheck/', include('precheck.urls')),
url(r'^djproj[/]?$', views.upload, name = 'home'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
當我嘗試瀏覽到example.com/djproj
它說,它Page not found at /
當阿帕奇傳回它丟棄網址似乎example.com/djproj
。同樣如果我嘗試example.com/djproj/precheck/
我得到一個404請求url爲example.com//precheck/
,它說The current path, /precheck/, didn't match any of these.
'這些'是在上面的urlpatterns列出的URL。
EDIT(顯示的網址是如何編碼):
upload.html
<form method = "POST" action="{% url 'precheck:upload' %}" enctype="multipart/form-data" name="uploadForm">
{% csrf_token %}
{% for field in form %}
<div class="form-row">
{{field.errors }}
{{ field.label_tag }} {{ field }}
{% if field.help_text %}
<p class ="help-text">{{ field.help_text }}</p>
{% endif %}
</div>
{% endfor %}
<br />
<button type="button" id="uploadButton" data-loading-text="Loading..." class="btn btn-primary" autocomplete="off">Upload</button>
</form>
注意使用{% url 'precheck:upload'}
在此處,它指向prechecks.urls
:
urls.py - 預檢
from django.conf.urls import url
from . import views
app_name = 'precheck'
urlpatterns = [
url(r'^success/', views.successful_upload, name = 'successful_upload'),
url(r'^failed_upload/', views.failed_upload, name = 'failed_upload'),
url(r'^run_precheck/', views.run_precheck, name = 'run_precheck'),
url(r'^running_checks/', views.run_selected_checks, name = 'run_selected_checks'),
url(r'^checks_successful/', views.checks_successful, name = 'checks_successful'),
url(r'^checks_failed/', views.checks_failed, name = 'checks_failed'),
url(r'^$', views.upload, name = 'upload'),
]
views。PY
@login_required
def upload(request):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES, user = request.user)
if form.is_valid():
form.save()
request.session['jobID'] = request.POST['jobID']
#job = Job.objects.filter(user_id = request.user.id).filter(jobID = request.POST['jobID']).latest()
# initialize(job)
return render(request,'precheck/run_precheck.html')
else:
form = UploadFileForm()
return render(request, 'precheck/upload.html',{'form': form})
就像你沒有使用''網址聲音()' '在模板和代碼中正確構建鏈接的完整絕對URL。必須使用這個,以便Django應用程序的安裝點包含在URL中。否則,你會錯過''/ djproj''前綴。見https://docs.djangoproject.com/en/1.11/ref/templates/builtins/#url –
@GrahamDumpleton看着你鏈接和玩弄這個文件我不認爲這是問題。 請參閱上面的編輯進行推理。 – chaserchap
你在url模式中的路由在前面不應該有''djproj /'''。這被丟棄在爲模式匹配傳遞的URL中。換句話說,這些模式不應該包含WSGI服務器被告知使用的任何特定掛載點。另外,你的主頁模式應該是''r'^ $''',而不是''''''''''''''''''''''''後者的斜線可能會導致斜線重定向。使用''WSGIScriptAlias/djproj''也更爲常見。這在裝載點的mod_wsgi指令中沒有結尾斜槓。 –