避免在Django基于类的视图中重复

时间:2017-06-13 14:28:08

标签: python json django rest

我正在Django中编写一个Web应用程序,它以特定的方式使用。它不是使用存储在数据库中的模型,而是使用REST API从另一个应用程序和平台收集的JSON数据动态构建表单。

网页呈现一个表单,该表单显示数学参数及其值的列表。然后,用户可以更改(或不更改)这些值,然后按"运行"按钮显示一些计算结果。

表单是根据通过URL查询JSON数据获得的数据构建的(它给出了参数列表及其初始值)。根据规范,我必须使用Django并且不使用数据库来存储任何参数值数据(唯一存储的数据是JSON数据的URL地址)。

我最终得到了一些使用CBV的解决方案。我有一个结构的详细视图:

class SimulationView(DetailView):
    template_name='template.html'
    model=SimModel # provides URLs for REST API (URLs for querying parameter list and simulation function)

    # this is used to display the page with GET
    def get_context_data(self, **kwargs):
        # conn.request function that returns param_JSON in JSON/REST
        # for a SUBSET of parameters in param_JSON build a list of entries named init_entries. Note not all parameters from the JSON request are used for the user interface.
        # form = paramForm(initial=init_entries) and store in context['form']
        return context

    def post(self, request, *args, **kwargs):
        # because the user may have changed parameter values, need to rebuild the JSON dataset to return to the URL with a simulation request
        # conn.request function that returns param_list in JSON/REST
        # for each param in JSON param_list build a list of entries
        # form = paramForm(request.POST, request.FILES, initial=init_entries) and store in context['form']
        # use form data to build REST request for the simulation function
        # conn.request simulation function and get result in JSON
        # store result in context['result']
        return render(request, 'template.html', context)

template.html可以在执行GET时显示初始表单,在执行POST时也显示结果。

如您所见,存在性能问题。当您进行GET构建页面时,您必须执行REST连接以获取数据并构建表单和接口(这是正常的)。但是当你POST请求模拟时,你需要再次运行URL连接以获得JSON格式的参数列表,更改值,然后请求模拟结果。请注意,REST请求返回的参数多于显示给用户的参数,因此不能仅使用表单数据来构建正确的JSON请求。这有效,但效率低下。我试图将param_JSON存储在类的一个字段中,但这不起作用:在执行POST时,类会再次实例化,并且param_JSON值会丢失。

我需要一个get函数吗?或者我完全错了吗?总的来说,还有更好的方法吗?非常感谢您的建议。

2 个答案:

答案 0 :(得分:0)

基于类的视图专门用于防止您将事物存储在实例属性中,因为这不是线程安全的;数据将在所有请求之间共享。

在不同请求之间存储数据的地方是session

答案 1 :(得分:0)

我将回到原来的问题。我想知道最好的解决方案是使用AJAX吗?当用户通过GET访问页面时,我会渲染一次表单,然后使用AJAX处理POST调用,AJAX只更新页面的结果部分(图形,表格)而不再渲染表单。这听起来是合理的解决方案吗?