将Django App转换为DRF应用程序

时间:2017-07-17 14:32:03

标签: django

我有一个尚未上线的django应用程序,我刚收到使用API​​的请求,我最终选择了DRF。但我真的失去了一些组件。我能够登录,获取令牌并传递令牌来获取某些东西。它现在将在前端使用angular.as,它需要全部为JSON。

虽然我会重写视图,但我希望尽可能多地重用视图模块。例如。我有一个验证,验证表格的注册(它使用三种不同的观点,因为成员可以通过三种不同的方式注册,并适用一些条件,即自我注册,公司注册和公司代理注册)。

def validate_member(data,editing=False,directregistration=True):
     #data is passsed from forms.py. Return any error message and the cleaned data to the calling forms.py
     return [errmsg,data]

forms.py clean方法示例:

  class NewMemberForm(forms.Form):
  firstName=forms.CharField(max_length=25,required=True,widget=forms.TextInput())

def clean(self):

    self.cleaned_data=super(NewMemberForm,self).clean()

    validate_member_form=validate_member(self.cleaned_data,directregistration=True)

    #do we have error messages now?

    if len(validate_member_form[0])>0: #yes we have error messages
        raise forms.ValidationError(_(validate_member_form[0]),code='invalid')

    return validate_member_form[1]

和我的views.py:

    if request.method=='POST':

    err_found=False
    go_id=''

    form=NewMemberForm(request.POST or None)

    if form.is_valid():
     #create user
     pass

我看到forms.py在DRF APIView中没用(我至少没有得到一个例子)。如何在没有太多痛苦的情况下转换这样的应用程序?

1 个答案:

答案 0 :(得分:0)

这就是事情 - 你不能(至少不容易)。 DRF程序员决定将serializers实现为与django forms完全不同的并行结构。事实上,他们甚至不分享任何祖先。你当然可以使用mixin在表单和序列化器中共享代码,但是再次有一些细微的差别,如formsclean方法,而序列化程序有validate个。

以下是可以采用的几种最小化代码重复的策略 -

  1. 瘦视图和胖模型 - 尝试将大多数业务逻辑保留在模型中(如果它们与模型相关),或者在单独的域类中。视图应该只是模型和模板之间的连接,并且不应包含业务或模型相关的逻辑。这样,您编写的代码可以在django的普通视图和DRF视图中重用。如果你想更进一步,尝试在模型级别封装全局验证和约束(即总是成立的验证),然后你可以编写某些序列化器混合,从模型中捕获验证错误并将其显示给用户。

  2. 面向服务的体系结构 - 尝试将所有内容编写为服务或REST API,并在普通视图中使用这些服务。我的公司有一些性能问题,所以我最终编写了一个自定义请求客户端(在django测试客户端的行上),它实际上并没有向api发出http请求,但仍然提供了足够的抽象。这种方法起初可能看起来很有利可图,但从长远来看,它会产生非常混乱的代码。事实上,如果你愿意达到这样的程度,我建议采用下一种方法。

  3. 前端框架 - 如果您没有某些SEO限制,那么您当然可以转向基于JavaScript框架的前端架构。然后,您只需要编写DRF API,所有其他代码都应该由客户端框架处理。它还可以带来更好的用户体验。