2017-07-17 144 views
1

我有一個django應用程序還沒有生效,我剛剛收到使用API​​的請求,並最終選擇了DRF。但是我真的失去了一些組件。我能夠登錄,獲取令牌並傳遞令牌來獲得某些內容。它現在將在前端使用angular.as,它需要全部是JSON。將Django應用程序轉換爲DRF應用程序

雖然我會重寫視圖,但我希望儘可能重用特別是模塊。例如。我有一個驗證,可以驗證表格的註冊(它從三個不同的角度使用,因爲一個成員可以用三種不同的方式進行註冊,適用一些條件,例如自我註冊,公司註冊和公司代理註冊)。

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清潔方法,例如:

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(我沒能得到一個至少是例子)。如何轉換這樣的應用程序沒有太多的痛苦?

回答

0

這是事情 - 你不能(至少不容易)。 DRF程序員決定將serializers作爲完全不同於django forms的並行結構。事實上,他們甚至不分享任何祖先。您當然可以使用mixin在表單和序列化程序中共享代碼,但是再次存在細微差別,如formsclean方法,而序列化程序有validate

這裏是可以通過減少代碼重複的一些策略 -

  1. 瘦意見和脂肪模型 - 儘量保持大部分業務邏輯的無論是機型(如果它們是相關到模型),還是在單獨的域類中。視圖應該只是模型和模板之間的連接,不應該包含業務或模型相關的邏輯。這樣你寫的代碼可以在django的普通視圖和DRF視圖之間重用。如果您想進一步考慮這一點,請嘗試在模型級別封裝全局驗證和約束(即始終保持爲真的驗證),然後您可以編寫某些序列化器mixin,以從模型中捕獲驗證錯誤並將其顯示給用戶。

  2. 面向服務的體系結構 - 嘗試將所有內容寫入服務或REST API,並在普通視圖中使用這些服務。我的公司有一定的性能問題,所以我最終編寫了一個定製的請求客戶端(在django測試客戶端上),它實際上並沒有向api發出http請求,但仍然提供了足夠的抽象。這種方法一開始似乎有利可圖,但從長遠來看,它會創建非常混亂的代碼。事實上,如果你願意去這樣的程度,我會推薦下一個方法。

  3. 前端框架 - 假設您沒有一定的搜索引擎優化限制,那麼您肯定可以轉向基於前端JavaScript框架的體系結構。然後,您只需編寫DRF API,並且所有其他代碼都應由客戶端框架處理。它也是更好的用戶體驗。

+0

謝謝@hspandher。這聽起來像重寫很可能。如果我可以問,這個GET怎麼會成爲APIView。('act_id','act_name'))。my_activities = AssociationActivity.objects.annotate(act_id = F('id'),act_name = F('activity__name'))。values('act_id','act_name') .filter(association_id = asso_id) \t \t my_activities_listed =列表(my_activities) \t \t活動= Activity.objects.values( '編號', '姓名')。過濾器(活性= '有效') \t \t actvities_listed =列表(活動) \t \t reply = {'my_activites':my_activities_listed,'activities':actvities_listed} data = json.dumps(回覆) –

+0

@NieSelam對不起,你引用了什麼'GET'成爲? – hspandher

+0

任何想法@hspandher? –

相關問題