1.关于flask的码解jsonify与json.dumps的一些追溯和思考
2.Python - 一文入门Flask(Blueprint、SQLAlchemy部分)
3.å¨flaskä¸ä½¿ç¨jsonifyåjson.dumpsçåºå«
关于flask的码解jsonify与json.dumps的一些追溯和思考
有一天,我遇到了一个服务器报警问题,码解追踪错误栈时,码解发现是码解由于在使用 Flask 的 jsonify 函数时传入的字典中混入了 string 和 int 类型的键导致的。修改数据后,码解udp 穿透源码我开始思考这一设计背后的码解逻辑以及为何会如此设定。源码追溯路径指向 JSONDecoder、码解flask.json.__init__.py 及 _dump_arg_defaults。码解分析这部分源码,码解我发现项目使用的码解是继承自 Flask 的 JSONDecoder,稍作修改以兼容如 bson.ObjectId 和 datetime 等数据类型,码解其主体基于标准库中的码解 JSONEncoder。
进一步深入 JSONEncoder 的码解源码,我发现 sort_keys 的码解使用在 JSONEncoder._iterencode_dict 中。此时,我开始思考是否可以修改为始终使用默认的 False,以确保 key 为纯字符串。然而,官方为何没有选择这一方案?我开始在 GitHub 上寻找答案,最终在 issue 中找到了线索。linux python源码封装在 Python 2 中确实如我所想,但在 Python 3 中,设计发生了改变。大佬们解释了背后的理由。
深入思考后,我倾向于支持 Python 3 的设计选择。首先,明确数据处理逻辑(如是否排序)是至关重要的。这里,我认为 Flask 的工具易语言源码默认设置为 False 是个错误,应该与标准库保持一致。其次,确保数据类型的一致性是动态语言的局限性之一,这也是我越来越偏爱 Go 的原因。
从工作角度来看,我得出以下思考:永远不要依赖传入的数据,务必进行验证,尤其是在关键业务中。这不仅是对 Flask 设计的反思,也是熊猫办公PPT源码对编程实践的提醒,强调了数据验证和明确数据处理逻辑的重要性。
Python - 一文入门Flask(Blueprint、SQLAlchemy部分)
本文将简要介绍如何入门Flask,包括安装准备、路由实现、Blueprint和SQLAlchemy的实践。首先,从安装Flask和pipenv开始,然后逐步构建项目结构,实现Web路由功能和数据库操作。域名展示平台源码
在PyCharm的环境配置部分,这里主要关注代码实现,而不是环境设置。在项目实践中,Flask的核心是通过App初始化时绑定Blueprint实现路由。首先,创建一个入口文件,负责实例化App并初始化配置、控制器和数据库。
启动文件中,需要进行判断逻辑的引入,这是为了优化程序运行。Flask路由功能是通过蓝图实现的,需要在入口文件中注册蓝图。每个路由器可以使用装载器优化,如在api文件中的示例所示。
完成路由后,我们转向数据库操作,Flask推荐使用SQLAlchemy处理。安装Flask-SQLAlchemy和PyMySQL,便于与MySQL数据库的交互。定义数据库操作的基类和公共方法,减少代码重复。
在入口文件中,通过SQLALCHEMY_DATABASE_URI配置数据库连接,使用with关键字确保资源的正确管理和释放。在model模块中,定义模型、常量和数据库操作方法,这些在路由中会被使用。
关于SQLAlchemy的Mysql编码和列类型,可能需要进行一些优化,包括默认值、索引设置和兼容不同列类型。Python源码提供了详细的设置指导,例如TinyINT类型和VARCHAR的使用。
最后,自定义数据库名和字符集编码时,可以使用__tablename__和字符集设置。编程中,阅读源码注释和示例可以帮助更好地理解和学习。
å¨flaskä¸ä½¿ç¨jsonifyåjson.dumpsçåºå«
1.Content-Typeæåºå«
jsonifyçä½ç¨å®é ä¸å°±æ¯å°æä»¬ä¼ å ¥çjsonå½¢å¼æ°æ®åºååæ为jsonå符串ï¼ä½ä¸ºååºçbodyï¼å¹¶ä¸è®¾ç½®ååºçContent-Type为application/jsonï¼æé åºååºè¿åè³å®¢æ·ç«¯ãjsonifyçé¨åæºç å¦ä¸ï¼
def jsonify(*args, **kwargs):
if __debug__:
_assert_have_json()
return current_app.response_class(json.dumps(dict(*args, **kwargs),
indent=None if request.is_xhr else 2), mimetype='application/json')
å¯ä»¥çåºjsonifyå®é ä¸ä¹æ¯ä½¿ç¨äºjson.dumpsæ¥åºååjsonå½¢å¼çæ°æ®ï¼ä½ä¸ºååºæ£æè¿åãindent表示jsonæ ¼å¼åç缩è¿ï¼è¥æ¯Ajax请æ±åä¸ç¼©è¿ï¼å 为ä¸è¬Ajaxæ°æ®æ²¡å¿ è¦ç´æ¥å±ç¤ºï¼ï¼å¦å缩è¿2æ ¼ãä½æ³å¿ ä»ç¬¬ä¸é¨åçå®éªç»ææ们已ç»çåºæ¥äºï¼ä½¿ç¨jsonifyæ¶ååºçContent-Typeå段å¼ä¸ºapplication/jsonï¼è使ç¨json.dumpsæ¶è¯¥å段å¼ä¸ºtext/htmlãContent-Typeå³å®äºæ¥æ¶æ°æ®çä¸æ¹å¦ä½çå¾ æ°æ®ï¼å¦ä½å¤çæ°æ®ï¼å¦ææ¯application/jsonï¼åå¯ä»¥ç´æ¥å½åjson对象å¤çï¼è¥æ¯text/htmlï¼åè¿è¦å°ææ¬å¯¹è±¡è½¬å为json对象ååå¤çï¼ä¸ªäººç解ï¼æ误请ææ£ï¼ã
2.æ¥ååæ°æåºå«
jsonifyå¯ä»¥æ¥ååpythonä¸çdictæé å¨åæ ·çåæ°ï¼å¦ä¸å¾ã
èjson.dumpsæ¯jsonifyå¯ä»¥å¤æ¥ålistç±»ååä¸äºå ¶ä»ç±»åçåæ°ãä½æè¯äºä¸ä¸ï¼å½¢å¼ä¸ºkey1=value1ï¼[key2=value2,...]è¿æ ·çåæ°æ¯ä¸è¡çï¼ä¼æ¥åºâTypeError: dumps() takes exactly 1 argument (0 given)âè¿ä¸é误ï¼èjsonifyä¸ä¼æ¥é并è½æ£å¸¸è¿åæ°æ®ã
æåï¼æ们å¯ä»¥ä½¿ç¨flaskä¸çmake_responseæ¹æ³æè ç´æ¥éè¿Responseç±»ï¼éè¿è®¾ç½®mimetypeåæ°æ¥è¾¾å°å使ç¨jsonifyå·®ä¸å¤çææï¼ä½å°åç¹ä»£ç ä½ä¹èä¸ä¸ºå¢ï¼åµä¸ç®æ´ä¸ç¹æ´ä¸å®¹æåºéï¼åæ°è¶å¤è°è¯åç»´æ¤å°±è¶éº»ç¦ãå½ç¶ï¼ä½¿ç¨åªä¸ªå¹¶ä¸æ¯ç»å¯¹çï¼å¿ è¦æ¶è¦æ ¹æ®å端çæ°æ®å¤çæ¹å¼æ¥å³å®ã