Python常用的框架,python常用的框架
个人资料
学习海量开放在线课程课程,实现Flask前端分离API后台接口演示,前端可以访问小程序,临时完成后台API基础架构,调试。跟着邮递员走。
重建部门:
肯检查模块
Auths认证模块
复制权限模块,添加全局扫描程序(见flask HTTPExceptions模块))))。
收获
我们可以接受定义的复杂,但不能接受调用的复杂。
如果你觉得写代码太累太无聊,就止步于功能的实现吧。该功能的安装非常简单。我们要寻求更好的文笔,抽象艺术,创造而不是机械劳动,寻求自己的思考。
Sqlalchemy使用元类来创建类,所以调用时不需要实例化。若要执行实例化对象的构造函数,必须重写__init__方法。
级别模块(api访问权限)的设计和超市管理者、经理、一般用户、客人之间的关系一样,是一种包含关系,所以权限控制模块可以建立在考虑合并和排除的基础上。参考这个项目的app.libs.scope。
要学会解决问题,首先要有深度和广度,懂得转移应用,形成自己的思维模式。
知识点再生
初始化flash应用程序
APP=flask(_name_,static_folder=views/statics ,static_url_path=/static ,template_fath
创建flask APP应用程序实例对象。如果模块存在,将根据模块所在的目录搜索静态文件和模块文件。如果模块不存在,默认使用app对象所在的项目目录。
__name__就是把这个模块所在的目录作为工作目录,从这个目录中寻找静态语句等等。
Static_folder指定静态文件的相对路径。Flask默认使用/splits,类似于Django中的STATICFILES_DIRS作为最后一个访问url。
Static_URL_path指定了访问静态文件的URL地址前缀,就像Django的Static_URL一样。
模板文件夹指定模板文件的目录。
@属性
efstatic_URL_path(self):
" " theurlprifixthatthestaticroutewillbaccessiblefrom .
如果在初始化期间没有配置它,它将从
:attr:`static_folder `。
""
如果自我。_ static _ URL _ pathisnotnone:
回归自我。_静态_ url _路径
if self.static _ folderisnotnone:
basename=OS . path . basename(self . static _ folder)).
返回(/) basename(。RS trip ) )/)).
@static_url_path.setter
defstatic_URL_path(self,value):
如果值不为无:
价值=价值。RStrip(/)
自我。_ static _ url _ path=值
Flask的Url相关基类
BaseConverter子类:保存提取的url参数匹配规则
规则类:记录url和视图函数的对应关系。
Class:记录所有url地址和试用函数对应的关系图(rule,rule,)。
MapAdapter类:url匹配的过程包括match method和rule.match(path,method)。
自定义路线管理器
从烧瓶导入闪存
APP=flask(_name__)
fromwerkzeug . routiningimportbase converter
Classregexurl(基本转换器):
#匹配参数时指定正则表达式
#例如:# regex=\d{6}
def __init__(self,url_map,regex):
""
:param url_map: flask将自动传递此参数。
:param regex:自定义匹配规则
""
超级(regexURL,self)。__init__ ) ) URL_
地图)
self.regex=regex
#在相应的尝试函数之前调用
#从url中提取参数后,将首先调用to_python
#将提取的值作为参数传递给to_pthon,并返回给相应的尝试。
def to_python(self,value):
您可以在这里进行一些参数类型转换
返回值
#调用url_for时,会在url反向解析过程中调用它来处理url参数处理。
#返回值用于拼接url
def to_url(自身,值):
对接收到的参数进行一些过滤等。
返回值
#将自定义路由转换器类添加到转换器字典中。
app . URL _ map . converters[ re ]=regex URL
#案例
@app.route(/user/)
定义你好(id):
返回fhello {id}
if __name__==__main__ :
app.run(调试=真)
全局异常捕获
AOP编程思想,面对面编程,把事件统一在一个地方,在一个统一的出口处理。
在FLASK版之前,errorhandler只支持填写对应的错误代码,比如@app.errorhandler(404)
flask1.0版以后,支持全局异常捕获@ app . error handler(code _ or _ exception)。这样,您就可以进行全局的异常捕获,而不必对每个视图函数都进行异常捕获。
@app.errorhandler(异常)
定义框架_错误:
if isinstance(e,APIException):
返回e
elif isinstance(e,HTTPException):
代码=电子代码
msg=e .描述
错误代码=1007
返回APIException(消息,代码,错误代码)
否则:
如果不是current_app.config[DEBUG]:
返回服务器错误()
否则:
提高e
异常类型
可预测异常(已知异常)
完全无意识异常(未知异常)
中止功能
Abort(状态代码)是抛出异常的默认方法。
调用abort函数会抛出与指定状态代码对应的异常消息。
中止功能将立即终止当前查看功能的操作* *
模型对象的序列化
场景:有时,我们可能需要返回模型对象中的一些字段或所有字段。通常的做法是将对象中的所有字段都变成字典来返回jsonnify(数据),但这种写法可能会在每一个尝试的需要返回数据的函数中写一个对应的字典。对象字典正在返回。默认情况下,Json不能序列化对象。一般我们的做法是json.dumps (obj,default=lambda O: O. __dict__),但是__dict__(基本上由我们的模型类定义的类属性)中只保存实例属性。要解决这个问题,就要看如何在jsonify中序列化,然后如何重写。
重写JSONEncoder
从日期时间导入日期
从烧瓶导入烧瓶as _Flask
从flask.json导入JSONEncoder作为_JSONEncoder
类JSONEncoder(_JSONEncoder):
重写json序列化,使模型类可序列化。
def default(self,o):
if hasattr(o, keys )和hasattr(o, __getitem__ ):
返回字典(o)
if isinstance(o,date):
返回o.strftime(%Y-%m-%d )
超级(JSONEncoder,self)。默认(o)
#被覆盖的类需要绑定到应用程序
class Flask(_Flask):
json_encoder=JSONEncoder
类别的定义
类别用户(基本):
id=列(Integer,primary_key=True)
email=Column(String(24),unique=True,nullable=False)
昵称=列(字符串(24),唯一=真)
auth=Column(SmallInteger,默认值=1)
_password=Column(password ,String(100))
定义键(自身):
return [id , email ,昵称, auth]
def __getitem__(self,item):
返回getattr(自身,项目)
注意:修改json_encode方法后,任何调用flask.json模块的人都会采用这个方法。
为什么要写key和__getitem__方法?
当我们使用dict(object)操作一个对象时,dict会先在实例中寻找keys的方法,并将其返回列表的值作为key,然后根据object[key]得到相应的值。因此,在调用括号中的属性之前,实例必须实现__getitem__方法。
高级书写-控制返回的字段。
场景:当我们有一个book的模型类,我们的api接口可能需要返回Book的details页面,所以我们要返回所有的字典,但是另一个接口可能只需要返回一些字段。
类别簿(基础):
id=列(Integer,primary_key=True,autoincrement=True)
title=Column(String(50),nullable=False)
Author=column (string (30),默认= unnamed )
binding=Column(String(20))
publisher=Column(String(50))
价格=列(字符串(20))
页数=列数(整数)
pubdate=Column(String(20))
isbn=Column(String(15),nullable=False,unique=True)
summary=Column(字符串(1000))
image=Column(String(50))
# orm实例化对象,字段需要写在构造函数中,这样每个实例对象都会有自己的副本,删除和增加互不影响。
@orm.reconstructor
def __init__(self):
self.fields=[id , title , author , binding ,
出版商,价格,页数,出版日期,
isbn ,摘要,图像]
定义键(自身):
如果hasattr(self, fields) else [],则返回自我领域
定义隐藏(自身,*键):
对于键中键:
self.fields.remove(键)
回归自我
定义附加(自身,*键):
对于键中键:
self.fields.append(键)
回归自我
@api.route(/search )
定义搜索():
books=Book.query.filter().all() #根据某些条件搜索的
书=[书。隐藏(“摘要”)书籍中的书籍]
返回jsonify(书籍)
@api,route(//detail )
定义详细信息(国际标准书号):
书=书。查询。filter _ by(ISBN=ISBN).first_or_404()
返回jsonify(图书)
请求钩子函数
在第一个请求之前:在处理第一个请求前运行。
之前_请求:在每次请求前运行。
请求之后:如果没有未处理的异常抛出,在每次请求后运行。
拆卸请求:在每次请求后运行,即使有未处理的异常抛出。
全局扫描器
模仿烧瓶例外预加载各个异常类的方式,将用户组自动加载进内存中,这样获取的话就更方便
str2obj={}
level2str={}
def iteritems(d,*args,**kwargs):
返回iter(d.items(*args,**kwargs))
定义_查找_范围_组():
iteritems(全局变量())中的for _name,obj:
尝试:
is_scope_obj=issubclass(obj,BaseScope)
除了类型错误:
is_scope_obj=False
如果不是是_范围_对象或目标级别1:
继续
old_obj=str2obj.get(_name,None)
如果旧对象不是没有人并且是issubclass(obj,old_obj):
继续
str2obj[_name]=obj
level2str[obj.level]=_name
# 模仿烧瓶例外预加载各个异常类的方式,将用户组自动加载进内存
_find_scope_group()
删除_查找_范围_组
常见病菌
形式正则校验注意事项
r"{ 6,25}$ "
带空格和不带空格是两码事,正则里面{,} 连续不带空格
r"{ 6,25}$ "
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。