2013-05-22 55 views
1

我學習Django的兩個工作,所以我已經建立了一個非常簡單的表單/視圖/ URL例如Django POST/GET,GET工作,POST不從MATLAB(urlread)。使用django.test.client

  • Django的1.5.1版本
  • MATLAB版R2012A

forms.py

from django import forms 
import json 

class json_input(forms.Form): 

    jsonfield = forms.CharField(max_length=1024) 

    def clean_jsonfield(self): 
     jdata = self.cleaned_data['jsonfield'] 
     try: 
      json_data = json.loads(jdata) 
     except: 
      raise forms.ValidationError("Invalid data in jsonfield") 
     return jdata 

views.py

from django.http import HttpResponse 
from rds.forms import json_input 

def testpost(request): 

    if request.method == 'GET': 

     form = json_input(request.GET) 
     if form.is_valid(): 
      return HttpResponse('Were Good Get',mimetype='text/plain') 

    elif request.method == 'POST': 

     form = json_input(request.POST) 
     if form.is_valid(): 
      return HttpResponse('Were Good Post',mimetype='text/plain') 

    else: 
     return HttpResponse('Not GET or POST.',mimetype='text/plain') 

當我跳進本地機器上的Django的蟒蛇manage.py殼這一觀點被映射到URL中urls.py

url(r'^test2$','rds.views.testpost'), 

所以是我可以發出以下命令並獲得預期的響應:

>>> from django.test.client import Client 
>>> c = Client() 
>>> r = c.post('/test2',{'jsonfield': '{"value":100}'}) 
>>> print r 
Content-Type: text/plain 

Were Good Post 
>>> r = c.get('/test2',{'jsonfield': '{"value":100}'}) 
>>> print r 
Content-Type: text/plain 

Were Good Get 

但是,當我在外部機器上跳轉到MATLAB併發出以下命令時。 (請注意,從MATLAB這樣做是一個項目需求)

json = '{"value":100}'; 

% GET METHOD FOR JSON FORM 
[gresponse,gstatus]=urlread('http://aq-318ni07.home.ku.edu/django/test2','Get',{'jsonfield' json}); 

% POST METHOD FOR JSON FORM 
[presponse,pstatus]=urlread('http://aq-318ni07.home.ku.edu/django/test2','Post',{'jsonfield' json}); 

>> gresponse 
    gresponse = 
    Were Good Get 
>> presponse 
    presponse = 
     '' 

我已經搜索了一個解決方案,真的找不到任何東西。我碰到這可能是CSRF的一個問題(我仍然認爲這是一個問題)。任何提示或想法將不勝感激。

謝謝。

編輯:

Django是通過Apache公開的,這裏是配置。

################################################ 
# Django WSGI Config 
################################################ 

WSGIScriptAlias /django /var/django/cdp/cdp/wsgi.py 
WSGIPythonPath /var/django/cdp 

<Directory /var/django/cdp/cdp> 
<Files wsgi.py> 
Order deny,allow 
Allow from all 
</Files> 
</Directory> 

################################################ 
+0

注意,這種形式永遠不需要顯示(無模板)。唯一需要的是一個響應,最終可能是文本狀態,查詢結果(如JSON)或數據(如JSON)。 –

回答

1

你是如何暴露的MATLAB您的Django應用程序?首先要檢查您的訪問日誌,您的服務器是否收到請求?如果在其錯誤日誌中包含任何內容?

您是否使用內置的developkment服務器? python manage.py runserver 0.0.0.0:8000 如果是這樣,確保你能接受該端口上的請求

如果您是通過另一臺服務器,我相信你有whitelist的IP,你是從MATLAB製作的要求,將其添加到ALLOWED_HOSTS

爲它服務
+0

對不起,省略此信息。 Django使用WSGI通過Apache路由。這最終將成爲一個公共項目,因此添加個人IP將無法正常工作。我將用我的WSGI/Apache配置添加一個編輯。 –

+0

@kpurdon是在Apache訪問日誌中顯示的請求? – dm03514

+0

是的。 「POST/django/test2 HTTP/1.1」403 2282「 - 」「MATLAB R2012a」 –