2017-09-08 48 views
0

我目前在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}) 
+0

就像你沒有使用''網址聲音()' '在模板和代碼中正確構建鏈接的完整絕對URL。必須使用這個,以便Django應用程序的安裝點包含在URL中。否則,你會錯過''/ djproj''前綴。見https://docs.djangoproject.com/en/1.11/ref/templates/builtins/#url –

+0

@GrahamDumpleton看着你鏈接和玩弄這個文件我不認爲這是問題。 請參閱上面的編輯進行推理。 – chaserchap

+0

你在url模式中的路由在前面不應該有''djproj /'''。這被丟棄在爲模式匹配傳遞的URL中。換句話說,這些模式不應該包含WSGI服務器被告知使用的任何特定掛載點。另外,你的主頁模式應該是''r'^ $''',而不是''''''''''''''''''''''''後者的斜線可能會導致斜線重定向。使用''WSGIScriptAlias/djproj''也更爲常見。這在裝載點的mod_wsgi指令中沒有結尾斜槓。 –

回答