2012-04-06 8 views
1

method = "POST"を持つフォームを送信すると、それを処理するビューがメソッドGETを取得していますが、これはPOSTファイルアップロードのために。私の既存のもの(1週間前、1.4にアップグレードする前に作業していたもの)を缶詰めして、フォームをhttps://docs.djangoproject.com/en/dev/topics/http/file-uploads/からアップロードすると、ここで間違っているのが分かりますか?同じ結果でChrome Incognitoを使って新鮮なセッションを試しました。 method = "POST"を含まない場合、メソッドGETとともに送信され、フィールドはrequest.GET辞書に電子メールで含まれます。しかし、POST/POSTに変更すると、メソッドGETのままで、フィールドはrequest.POSTまたはrequest.GETディクショナリにありません。この現象を引き起こしているDjango 1.4にバグがありますか?私は行方不明のものがありますか?私は、無関係な潜在変数を除外するための簡単な例を作ろうとしました。Django 1.4フォーム送信メソッドをGETにする

簡単なテストシナリオ:

urls.py:

url(r'^upload_test/+$', 'views.presentation.UploadTest'), 
url(r'^uploaded_test/+$', 'views.presentation.UploadedTest'), 

ビュー/ presentation.py:

def Notify(subject, body): 
    """ 
     Send an email to <to_email>, from <from_email> with the 
     subject and body supplied. 
    """ 
    send_mail(subject, body, '<from_email>', ['<to_email>'], fail_silently=False) 

def UploadTest(request): 
    Notify("UploadTest", "METHOD: " + str(request.method) + """ 

    """ + str(request)) 
    return render_to_response('upload.htm', context_instance=RequestContext(request)) 

def UploadedTest(request): 
    Notify("UploadedTest", "METHOD: " + str(request.method) + """ 

    """ + str(request) + """ 

    FILES: 
    """ + str(request.FILES)) 
    return render_to_response('upload.htm', context_instance=RequestContext(request)) 

upload.htm(注方法は、POSTであるI場合によっては小文字で試してみました):

簡単なテストシナリオの
<form 
    id="upload_file_form" 
    action="/uploaded_test" 
    method="POST" 
    enctype="multipart/form-data" 
    target="_blank" 
> 
    {% csrf_token %} 
    <input type="text" name="extra_field" value="extra post field" /> 
    <input type="file" name="upload_file" id="upload_file" /> 
    <input type="submit" name="upload" value="Submit" /> 
</form> 

結果

私が得る電子メールが(最初は、フォームの事前提出し、第二は、投稿フォームページであることに注意):

最初のメール(件名"UploadTest"):

METHOD: GET 

<WSGIRequest 
    path:/upload_test/, 
    GET:<QueryDict: {}>, 
    POST:<QueryDict: {}>, 
    COOKIES:{ 
     'csrftoken': '...', 
     'sessionid': '...'}, 
    META:{'CSRF_COOKIE': '...', 
    'DOCUMENT_ROOT': '...', 
    'GATEWAY_INTERFACE': 'CGI/1.1', 
    'HTTPS': '1', 
    'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
    'HTTP_ACCEPT_ENCODING': 'gzip, deflate', 
    'HTTP_ACCEPT_LANGUAGE': 'en-us,en;q=0.5', 
    'HTTP_CONNECTION': 'keep-alive', 
    'HTTP_COOKIE': '... csrftoken=...; CFID=16005; CFTOKEN=...; sessionid=...', 
    'HTTP_HOST': '...', 
    'HTTP_USER_AGENT': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:11.0) Gecko/20100101 Firefox/11.0', 
    'PATH_INFO': u'/upload_test/', 
    'PATH_TRANSLATED': '...site.wsgi/upload_test/', 
    'QUERY_STRING': '', 
    'REMOTE_ADDR': '10.1.0.100', 
    'REMOTE_PORT': '56037', 
    'REQUEST_METHOD': 'GET', 
    'REQUEST_URI': '/upload_test/', 
    'SCRIPT_FILENAME': '...site.wsgi', 
    'SCRIPT_NAME': u'', 
    'SERVER_ADDR': '10.1.10.12', 
    'SERVER_ADMIN': '...', 
    'SERVER_NAME': '...', 
    'SERVER_PORT': '443', 
    'SERVER_PROTOCOL': 'HTTP/1.1', 
    'SERVER_SIGNATURE': '', 
    'SERVER_SOFTWARE': 'Apache', 
    'SSL_TLS_SNI': '...', 
    'mod_wsgi.application_group': '...|', 
    'mod_wsgi.callable_object': 'application', 
    'mod_wsgi.handler_script': '', 
    'mod_wsgi.input_chunked': '0', 
    'mod_wsgi.listener_host': '', 
    'mod_wsgi.listener_port': '443', 
    'mod_wsgi.process_group': '', 
    'mod_wsgi.request_handler': 'wsgi-script', 
    'mod_wsgi.script_reloading': '1', 
    'mod_wsgi.version': (3, 3), 
    'wsgi.errors': <mod_wsgi.Log object at 0x1962048>, 
    'wsgi.file_wrapper': <built-in method file_wrapper of mod_wsgi.Adapter object at 0xb73d2770>, 
    'wsgi.input': <mod_wsgi.Input object at 0x1962020>, 
    'wsgi.multiprocess': True, 
    'wsgi.multithread': True, 
    'wsgi.run_once': False, 
    'wsgi.url_scheme': 'https', 
    'wsgi.version': (1, 1)}> 

SECOND EMAIL(件名 "UploadedTest" は、この方法は、依然として "GET" であり、通知HTTP_REFERERが正しいこと、およびrequest.FILESが存在

METHOD: GET 

<WSGIRequest 
    path:/uploaded_test/, 
    GET:<QueryDict: {}>, 
    POST:<QueryDict: {}>, 
    COOKIES:{ 
     'csrftoken': '...', 
     'sessionid': '...' 
    }, 
    META:{'CSRF_COOKIE': '...', 
    'DOCUMENT_ROOT': '...', 
    'GATEWAY_INTERFACE': 'CGI/1.1', 
    'HTTPS': '1', 
    'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
    'HTTP_ACCEPT_ENCODING': 'gzip, deflate', 
    'HTTP_ACCEPT_LANGUAGE': 'en-us,en;q=0.5', 
    'HTTP_CONNECTION': 'keep-alive', 
    'HTTP_COOKIE': 'csrftoken=...; sessionid=...', 
    'HTTP_HOST': '...', 
    'HTTP_REFERER': '.../upload_test/', 
    'HTTP_USER_AGENT': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:11.0) Gecko/20100101 Firefox/11.0', 
    'PATH_INFO': u'/uploaded_test/', 
    'PATH_TRANSLATED': '...site.wsgi/uploaded_test/', 
    'QUERY_STRING': '', 
    'REMOTE_ADDR': '10.1.0.100', 
    'REMOTE_PORT': '56040', 
    'REQUEST_METHOD': 'GET', 
    'REQUEST_URI': '/uploaded_test/', 
    'SCRIPT_FILENAME': '...site.wsgi', 
    'SCRIPT_NAME': u'', 
    'SERVER_ADDR': '10.1.10.12', 
    'SERVER_ADMIN': '...', 
    'SERVER_NAME': '...', 
    'SERVER_PORT': '443', 
    'SERVER_PROTOCOL': 'HTTP/1.1', 
    'SERVER_SIGNATURE': '', 
    'SERVER_SOFTWARE': 'Apache', 
    'SSL_TLS_SNI': '...', 
    'mod_wsgi.application_group': '...|', 
    'mod_wsgi.callable_object': 'application', 
    'mod_wsgi.handler_script': '', 
    'mod_wsgi.input_chunked': '0', 
    'mod_wsgi.listener_host': '', 
    'mod_wsgi.listener_port': '443', 
    'mod_wsgi.process_group': '', 
    'mod_wsgi.request_handler': 'wsgi-script', 
    'mod_wsgi.script_reloading': '1', 
    'mod_wsgi.version': (3, 3), 
    'wsgi.errors': <mod_wsgi.Log object at 0x1956b88>, 
    'wsgi.file_wrapper': <built-in method file_wrapper of mod_wsgi.Adapter object at 0x21cf0f8>, 
    'wsgi.input': <mod_wsgi.Input object at 0x1961048>, 
    'wsgi.multiprocess': True, 
    'wsgi.multithread': True, 
    'wsgi.run_once': False, 
    'wsgi.url_scheme': 'https', 
    'wsgi.version': (1, 1)}> 

    FILES: 
    <MultiValueDict: {}> 

疑わしいが、おそらくそれは私のWSGIファイルに間違った何か、または私のApacheのサイトディレクティブである:。しかし)は空です。

... WSGI:ここだけの場合とは、ある

import os 
import sys 

path = '/var' 
if path not in sys.path: 
    sys.path.append(path) 

path = '/var/www' 
if path not in sys.path: 
    sys.path.append(path) 

path = '/var/www/site' 
if path not in sys.path: 
    sys.path.append(path) 

os.environ['DJANGO_SETTINGS_MODULE'] = 'site.settings' 

import django.core.handlers.wsgi 
application = django.core.handlers.wsgi.WSGIHandler() 

Apacheのサイトを有効ディレクティブ:

<VirtualHost 10.1.10.12:80> 
    ServerName ... 
    RewriteEngine on 
    RewriteCond %{HTTPS} !=on 
    RewriteRule ^/(.*) https://%{SERVER_NAME}/$1 [R,L] 
</VirtualHost> 


<Directory /var/www/site> 
    RewriteEngine on 
    RewriteCond 1 =1 
    RewriteRule ^/(.*) https://%{SERVER_NAME} 
</Directory> 


<VirtualHost 10.1.10.12:443> 
    ServerName ... 
    DocumentRoot /var/www/site 
    ServerAlias ... 
    ErrorLog /var/log/apache2/site-error.log 
    LogLevel warn 
    CustomLog /var/log/apache2/site-access.log combined 
    WSGIScriptAlias//var/www/site/site.wsgi 
    SSLEngine on 
    SSLCertificateFile ... 
    SSLCertificateKeyFile ... 

    # Media serving, must specify which files to serve and not 
    # hand their urls to the django framework. 
    Alias /robots.txt .../robots.txt 
    Alias /favicon.ico .../favicon.ico 

    Alias /templates/ .../django_templates/ 
    Alias /static/ .../django_static/ 
    Alias /images/ .../django_static/images/ 

    <Directory /usr/local/lib/python2.6/dist-packages/django/contrib/admin/media/> 
      Order deny,allow 
      Allow from all 
    </Directory> 

    <Directory .../django_static/> 
      Order deny,allow 
      Allow from all 
    </Directory> 

    <Directory /usr/local/lib/python2.6/dist-packages/django/contrib/admin/media/js> 
      Order allow,deny 
      Allow from all 
    </Directory> 

    <Directory .../uploads/> 
      Order allow,deny 
      Allow from all 
    </Directory> 

    XSendFile on 

答えて

2

おそらく、私はurls.pyまたは正規表現の詳細を読む必要があります。私は偶然、フォームを開いてスラッシュなしでaction="uploaded_test"に変更し、 "POST"とrequest.methodを持つ404エラーレポートを受け取りました(何??@#$ * &)... ???これは、私のポスティングURLで何かでなければならないことを意味しました!私はそれを変更し

'^uploaded_test/+$' 

:私はそれを持っていた

'^uploaded_test$' 

とフォームがaction="/uploaded_test"に投稿して検証し、それが働きました!私はurls.pyに変更:

'^uploaded_test/$' 

action="/uploaded_test/"に投稿するフォームを変更し、それはまた働きました!私は多くのエントリの/ locまたは/ loc /のいずれかを受け入れることができるように、ほとんどの私のURLエントリの/ +を持っていました。私はそれらを元に戻すと思う。これが正規表現/+の構文についてわからないバグなのかどうかわかりません。

+1

'/ +'は複数の '/'にマッチし、 '/?' 0または1の '/'と一致するようにします。通常、これは実際には必要ありません。refs https://docs.djangoproject.com/en/1.4/ref/settings/#append-slash – okm

1

あなたは中のif-else文を試してみましたあなたのプレゼンテーション層? たとえばif request.method == 'POST':と残りのコード。

+0

はい、私もそれを試しました。それはURLの正規表現だった。/+を使用すると、スラッシュが1つまたはスラッシュを意味するはずです。私がそれを削除して、/ uploaded_testに行ったら、それはうまくいった。私はスラッシュを持つように変更したときに+を付けずにフォームを/ uploaded_testに変更しました。あなたの答えをありがとう。 – Furbeenator

+0

良い良い:Dあなたがそれを固定してうれしい。ハッピー学習 –

関連する問題