相关疑难解决方法(0)

单元测试Django JSON View

我正在尝试为一些Django json_view视图编写一些单元测试,而我在将json_string传递给视图时遇到了麻烦.我昨天发布了一个相关的问题,关于将json字符串传递给JS的Django视图,问题是在我的JS中我只是传递json字符串,我需要传递字符串作为对象的属性,因为我如果没有这样做,则字符串被视为生成的查询字典的关键字.我再次遇到类似的问题,除了这次它是Django View的Django单元测试.这是我的代码的简化版本,它产生相同的结果.

class MyTestCase(TestCase):
    def setUp(self):
        self.u = User.objects.create_user('test','test','test')
        self.u.is_active = True
        self.u.save()
        self.client.login(username='test',password='test')

    def test_create_object_from_form(self):
        """Test the creation of the Instance from the form data."""
        import json
        json_string json.dumps({'resource':{'type':'book','author':'John Doe'}})
        print(json_string)
        response = self.client.post(reverse('ajax_view'),
                                    {'form':json_string},'json')
        self.assetNotContains(response,'error')
Run Code Online (Sandbox Code Playgroud)

并且视图看起来像这样

@json_view
def ajax_view(request):
    """Process the incoming form data."""
    if request.method == 'POST':
        print(request.POST)
        form_data = json.loads(request.POST['form'])
        resource_data = form_data['resource']
        form = MyUserForm(resource_data)

        if form.is_valid():
        ...
Run Code Online (Sandbox Code Playgroud)

以下是运行测试时两个打印语句产生的内容.json_string是

{"resource": {"type": "book", "author": "John Doe"}}
Run Code Online (Sandbox Code Playgroud)

和查询字典看起来像

<QueryDict: {u'{\'form\': \'{"resource": {"type": "book", "author": "John Doe"}}\'}': …
Run Code Online (Sandbox Code Playgroud)

python django ajax json unit-testing

10
推荐指数
1
解决办法
8427
查看次数

Django的Querydict奇怪的行为:将POST字典串成一个单独的键

在django中使用测试客户端时,我遇到了一种非常奇怪的行为.

我正在使用a POST将数据发送到我的django应用程序.我通常是从iPhone应用程序和/或测试html表单执行此操作.在服务器端,这是我处理它的方式:

def handle_query(request):
   print request
   q = con.QueryLog()
   q.ID = request.POST.get('ID', '')
   q.device = request.POST.get('device-model', '')
   ....
Run Code Online (Sandbox Code Playgroud)

那个print语句看起来像你期望的那样,即post请求中的每个参数都变成了字典中的一个键:

POST:QueryDict:{u'app-version':[u'3.0'],u'server-version':[u'v3d0'],

但是,我开始使用Django的测试客户端编写一些测试,无论我尝试什么,我在post请求中发送的POST参数字典都会聚集在一起QueryDict.请允许我用一些代码来说明:

class SearchTest(TestCase):def setUp(self):pass

def test_search(self):
    request = HttpRequest()
    data = '{"amzn_locale": "com"}'
    # request._raw_post_data = data
    resp = self.client.post(
        '/is/', 
        data=data,
        content_type='application/x-www-form-urlencoded',
        # content_type='application/json',
        )
Run Code Online (Sandbox Code Playgroud)

服务器端的相同print语句显示字典无法解释为字符串:

POST: QueryDict: {u'{"amzn_locale":"com"}': [u'']}>,
Run Code Online (Sandbox Code Playgroud)

如果我将数据设置为实际字典,同样的事情

data = {"amzn_locale": "com"}
Run Code Online (Sandbox Code Playgroud)

设置request._raw_post_data不会改变任何内容.改变也没有

content_type='application/json'
Run Code Online (Sandbox Code Playgroud)

任何帮助将非常感激.从这个stackoverflow问题看起来我似乎不是第一个遇到这个 iphone的Json POST请求到Django服务器在QueryDict中创建QueryDict

python django rest post

5
推荐指数
1
解决办法
3937
查看次数

标签 统计

django ×2

python ×2

ajax ×1

json ×1

post ×1

rest ×1

unit-testing ×1