Django POST/GET,GET works,POST Nots';t来自MATLAB(urlread)。两者都使用django.test.client工作

Django POST/GET,GET works,POST Nots';t来自MATLAB(urlread)。两者都使用django.test.client工作,django,matlab,django-csrf,urlread,Django,Matlab,Django Csrf,Urlread,我正在学习Django,所以我设置了一个非常简单的表单/视图/url示例 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.cl

我正在学习Django,所以我设置了一个非常简单的表单/视图/url示例

  • 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
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')
url(r'^test2$','rds.views.testpost'),
视图.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
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')
url(r'^test2$','rds.views.testpost'),
此视图映射到url.py中的url

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
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')
url(r'^test2$','rds.views.testpost'),
因此,当我跳入本地机器django上的python manage.py shell时,我可以发出以下命令并获得预期的响应:

>>> 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执行此操作是项目要求)

我到处寻找解决办法,但真的什么也找不到。我发现这可能是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>

################################################
################################################
#Django WSGI配置
################################################
WSGIScriptAlias/django/var/django/cdp/cdp/wsgi.py
WSGIPythonPath/var/django/cdp
命令拒绝,允许
通融
################################################

你是如何公开你的django MATLAB应用程序的?首先要检查您的访问日志,您的服务器是否收到请求?如果有,错误日志中是否有任何内容

您正在使用内置的开发服务器吗?
python manage.py运行服务器0.0.0.0:8000
如果是这样,请确保您可以接受该端口上的请求


如果您是通过另一台服务器提供服务,我相信您必须通过将其添加到
ALLOWED\u HOSTS

注释中,将其添加到MATLAB请求的IP上,此表单无需显示(无模板)。唯一需要的是一个响应,它最终将是一个文本状态、查询结果(作为JSON)或数据(作为JSON)。Django使用WSGI通过Apache路由。这最终将是一个公共项目,因此添加个人IP是行不通的。我将使用WSGI/Apache config添加一个编辑。@kpurdon是Apache访问日志中显示的请求吗?是的。“POST/django/test2http/1.1”4032282“-“MatlabR2012A”看起来确实像是CSRF问题。但是,我找不到任何关于如何为我的案例实现这一点的信息,因为没有呈现模板。有什么想法吗?谢谢,我想我现在走对了。看起来django REST框架将解决我的一些顾虑。