FireService是一个创建Python服务的简单库
fireservice的Python项目详细描述
消防服务
FireService是一个创建Python服务的简单库。在
- 声明性输入字段。在
- 输入验证。在
- 不可变字段。在
- 执行回调。在
- 少用生化武器。在
- 尽可能使用本机Python对象。在
- 可通过自定义字段类型和验证器进行扩展。在
- 为处理任何输入的类提供优雅的上层结构。在
安装
要使用pip安装FireService,请运行:pip install fireservice
要使用pipenv安装FireService,请运行:pipenv install fireservice
基本用途
fromfireserviceimportIntegerField,StringField,FireServicefromfireservice.exceptionsimportSkipError,ValidationErrorCRAWLED_DB=[]defpage_name_validator(name,value):ifnotvalue.endswith('.html'):raiseValidationError(name,'I only know html pages!')classCrawler(FireService):# All fields are required by defaultuser_id=IntegerField(min_value=1)page_name=StringField(validators=[page_name_validator])defurl(self):# Fields are directly accessible using instance __dict__return'http://example.com/{}/{}'.format(self.user_id,self.page_name)defpre_fire(self):ifself.url()inCRAWLED_DB:# Control directly goes to post_fire methodraiseSkipError('Page already crawled!')deffire(self,**kwargs):CRAWLED_DB.append(self.url())defpost_fire(self,fired,exc):iffired:print('I crawled!')else:print('I skipped crawling because: ',exc)crawler=Crawler()crawler.call({'user_id':1,'page_name':'about.html'})# Values are stored in native python types wherever possible:print(type(crawler.user_id),type(crawler.page_name))# <class 'int'> <class 'str'># Raises ModificationError as all Fields are immutablecrawler.user_id=2
显示嵌套字段类型的稍微复杂的示例:
^{pr2}$什么是服务?在
服务是执行某些业务逻辑的域模型的一部分。通常,它们处理一组输入并更改某些状态或返回计算值。在Python这样的非类型安全语言中,输入验证和处理动态输入的程序的通用接口可能是一个问题。在
一些阅读资源:
- https://en.wikipedia.org/wiki/Service_layer_pattern
- https://www.martinfowler.com/bliki/AnemicDomainModel.html
文件
查看文档:https://kpchand.github.io/fireservice/。 如果重定向失败,则直接转到here。在
扩大消防服务
我们也可以创建自定义字段。假设我们的应用程序采用模式xxx yyy zzz的用户ID。我们可以创建一个StringField
,并使用一个自定义的validator。但是,如果我们有一个Field
类型在默认情况下进行验证,那么它将更加方便和声明性。下面是这样一个实现的例子:
classIDField(StringField):"""A Field which takes input in the pattern xxx-yyy-zzz. """defdefault_validator(self,value):# Use StringField validator to validate strsuper().default_validator(value)value=value.split('-')iflen(value)!=3ornotall([len(v)==3forvinvalue]):raiseValidationError(self.name,'Improper format')classService(FireService):user_id=IDField()deffire(self,**kwargs):print('user_id: ',self.user_id)s=Service()s.call({'user_id':'foo-bar-baz'})
灵感
FireService的灵感来源于django-service-objects,但其设计目的是与任何框架一起工作,并且尽可能接近原始Python。在
为什么叫消防队?在
当您调用call()
时,它将启动fire()
,而{FireService
。在
- 项目
标签: