Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从外部python脚本调用django视图函数_Python_Django - Fatal编程技术网

如何从外部python脚本调用django视图函数

如何从外部python脚本调用django视图函数,python,django,Python,Django,下面是my views.py方法的外观: def save(request): if request.method == 'POST': post = json.loads(request.body) post['id'] = int(post['id']) post['desc'] = post['description'] .... .... return HttpResponse(json.du

下面是my views.py方法的外观:

def save(request):
    if request.method == 'POST':
        post = json.loads(request.body)
        post['id'] = int(post['id'])
        post['desc'] = post['description']
        ....
        ....
    return HttpResponse(json.dumps({'message': message, 'saved_item': saved_id}))
现在我需要从django项目目录之外调用这个save方法。我相信这可以通过导入这个views.py文件来实现,但我不确定如何将请求作为参数提供给这个方法


此外,此保存方法还与models.py文件进行一些交互,以将项目保存到数据库中。

您可以像往常一样运行服务器。从另一个python程序中,对该视图执行HTTP-(POST)请求

我推荐这个库,它非常容易使用:

小心 此代码将

  • 加载Django测试设备
  • 创建您必须填写的请求实体模型
  • 序列化数据,只需
  • 视图反序列化后,处理它
  • 序列化结果,您必须
  • 针对响应的摘录
  • 再次反序列化
  • 除非您正在为视图构建一个测试用例,否则这是一个骇客,一个丑陋的骇客。 您可以使用
    [django.test.RequestFactory][1]
    实例化请求实例:

    from django.test import RequestFactory
    from myapp import save
    
    self.factory = RequestFactory()
    request = self.factory.get('/customer/details')
    request = self.factory.post('/customers/',{"name":"alfred"})
    save(request)
    

    这通常对测试非常有用。

    将我的评论扩展到更详细的案例中。您的视图通常如下所示:

    def my_view(request):
        data = deserialize_data_from_request(request)
        result = do_something_with_data(data)
        return serialize_result_into_response(result)
    
    我相信,您想要的是从项目目录之外用数据做一些事情。您有两种方法可以实现这一点,而不必重复自己的工作:

    1)粗俗的方式。

    您没有处理HTTP请求,因此您:

    • 启动Django测试工具
    • 创建一个请求模型
    • 将数据序列化到请求模型中
    • 根据请求模型调用您的视图
      • 您的视图从请求中反序列化数据
      • 您的视图
        使用数据做了一些事情
      • 您的视图
        将\u结果\u序列化为\u响应
    • 从响应中提取序列化结果
    • 反序列化结果
    虽然它可以工作,但它肯定是笨拙和复杂的。这样做的唯一原因是在构建视图测试用例时,因为您实际上想要测试反序列化/序列化过程

    请参阅Sebastian Wozny的答案

    2)干净的方式。

    从视图中提取任务。以以下方式更改视图模块:

    def my_save_function(data):
        return do_something_with_data(data)
    
    def my_view(request):
        data = deserialize_data_from_request(request)
        result = my_save_function(data)
        return serialize_result_into_response(result)
    

    现在,您可以从外部代码直接调用
    my\u save\u函数
    。无需加载Django测试设备。无需多次序列化/反序列化数据。

    您希望实现什么?我严重怀疑你“有要求调用此方法”。更有可能的是,你需要完成一些事情。我猜你想保存一些数据,它有什么格式?该视图用于处理HTTP请求。您没有处理一个,因此不应该使用它。或者,根据falsetru的回答,并根据spectras的评论,我建议您将视图函数中的功能解耦为一个单独的函数。然后您可以从其他Python代码调用它。@spectras Sebastian的回答描述了我想要实现的目标。save方法包含一些python代码来执行一些任务,是的,我想保存一些数据并利用可重用性。我本可以再次编写相同的代码,这会引入重复代码。作为python程序员,应该尊重DRY()@Napstar,除非您正在构建测试用例,否则不应该使用Sebastian描述的方法。相反,您应该从视图中提取任务。创建一个名为的函数,比如说
    do\u save\u tasks
    。然后可以从外部代码和视图中使用此函数。这样,它是干燥的,并且您不会滥用Django测试设备。我将添加与我在删除后的答案中所做的完全相同的评论:不要这样做。这将1)加载Django测试工具,2)创建一个请求实体模型,您必须通过3)序列化数据来填充该实体模型,结果是4)视图在处理后将其反序列化,然后5)序列化结果,然后必须6)提取响应,7)再次反序列化。除非你正在为视图构建一个测试用例,否则这是一个骇客,一个丑陋的骇客。你的观点是什么?这可能是个坏主意,但这是关于实现而不是设计的答案。如果你认为这个答案可以改进,请留下评论。只是当被问到如何射中自己的脚时,我倾向于重视解释为什么这是个坏主意以及如何避免的答案,而不是像“这是枪,这是扳机,指着你的脚然后拉”这样的答案。尽管从技术上来说这是一个正确的答案。至少它应该有巨大的警告。并非在所有情况下这都是黑客行为。我有一个应用程序,用户可以(出于测试目的)像外部客户系统通常那样交互提交JSON对象。我希望它尽可能地表现为真正的外部调用,因此使用测试客户机是完全合适的方法。