第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

Django:如何在基于類和基于函數(shù)的自定義驗(yàn)證器之間做出決定?

Django:如何在基于類和基于函數(shù)的自定義驗(yàn)證器之間做出決定?

米琪卡哇伊 2023-10-31 21:46:11
這是一個(gè)初學(xué)者的問題。我最初是這樣聲明該字段的:from django.db import modelsfrom django.core.validators import FileExtensionValidatordef user_directory_path(instance, filename):? ? """? ? Code to return the path? ? """class Project(models.Model):? ? """? ? """? ? # ...Some model fields...? ? # Right now I'm only validating and testing with .mp4 files.? ? video_file = models.FileField(? ? ? ? upload_to=user_directory_path,? ? ? ? validators=[FileExtensionValidator(allowed_extensions=['mp4'])]? ? )但我在幾個(gè)地方讀到,最好使用它libmagic來檢查文件的幻數(shù)并確保其內(nèi)容與擴(kuò)展名和 MIME 類型匹配。我對此很陌生,所以我可能會弄錯(cuò)一些東西。我按照驗(yàn)證器參考編寫了一個(gè)使用magic.?該文檔還討論了“帶有方法的類”,這里__cal__()獲得最多支持的答案使用基于類的驗(yàn)證器。文檔說這可以“對于更復(fù)雜或可配置的驗(yàn)證器”來完成,但我不明白具體的例子是什么,以及我的基于函數(shù)的驗(yàn)證器是否足以滿足我想要做的事情。我想是的,但我沒有經(jīng)驗(yàn)來確定。這就是我所擁有的。models.pyfrom django.db import modelsfrom .validators import validate_media_filedef user_directory_path(instance, filename):? ? """? ? Code to return the path? ? """class Project(models.Model):? ? """? ? """? ? # ...Some model fields...? ? # Right now I'm only validating and testing with .mp4 files.? ? video_file = models.FileField(? ? ? ? upload_to=user_directory_path,? ? ? ? validators=[validate_media_file]? ? )遷移工作與此相關(guān)。我還使用擴(kuò)展名為 .mp4 的純文本文件進(jìn)行了測試,然后使用不同的文件(和擴(kuò)展名)對其進(jìn)行了測試,并且它可以工作。但是,我想知道使用它而不是基于類的驗(yàn)證器是否會丟失一些東西,而且,正如標(biāo)題所說,我應(yīng)該何時(shí)使用它,因?yàn)槲铱赡軙龅搅硪环N情況,在這種情況下我會需要知道它。我知道我沒有包含 MIME 類型;我可以稍后再做。magic.from_buffer()作為另一個(gè)問題,當(dāng)輸出與擴(kuò)展名和/或 MIME 類型不匹配時(shí),適當(dāng)?shù)腻e(cuò)誤消息是什么?我想到了“文件已損壞”的說法,但我不確定。實(shí)際上,這是直接基于幻數(shù)的輸出嗎?
查看完整描述

1 回答

?
慕尼黑5688855

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超2個(gè)贊

何時(shí)使用基于類的驗(yàn)證器?

在您的示例中,基于函數(shù)的驗(yàn)證器就足夠了。如果您需要 OOP、類和對象的優(yōu)點(diǎn),那么您應(yīng)該切換到基于類的驗(yàn)證器。想象一下以下非常虛構(gòu)的源代碼:


class StartsWithValidator():

    def __init__(self, starts_with):

        self.starts_with = starts_with


    def __call__(self, value):

        if not str(value).startswith(self.starts_with):

            raise ValidationError(

                'Your string does not start with: {}!'.format(self.starts_with),

                params={'value': value}

            )


my_validator = StartsWithValidator('123')

test_string = '123OneTwoThree'

my_validator(test_string) # Will it pass the validator?

您可以在這里看到不同的品質(zhì):


通過基于類的驗(yàn)證器,您可以使用對象。對象共享相同的功能但具有不同的內(nèi)部狀態(tài)。您現(xiàn)在可以設(shè)置一個(gè)驗(yàn)證器,它檢查字符串是否以“abc”、“123”開頭,而無需編寫新代碼

starts_with_abc = StartsWithValidator('abc')

starts_with_123 = StartsWithValidator('123')

starts_with_whatever = StartsWithValidator('whatever')

您可以使用繼承。想象一下,您想要在其他功能中重用starts-with-validation,您只需從“StartsWithValidator”類繼承即可。

class StartsWithABCValidator(StartsWithValidator):

    def __init__(self):

        super().__init__('ABC')


    def __call__(self, value):

        super().__call__(value)

如果你的驗(yàn)證器做了很多復(fù)雜的事情,一個(gè)簡單的函數(shù)可能會導(dǎo)致可讀性差的代碼。如果您使用類,您就可以封裝您的功能并將其分組在一起。


查看完整回答
反對 回復(fù) 2023-10-31
  • 1 回答
  • 0 關(guān)注
  • 164 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號