
刚刚学习 python2 个月,这段代码基本功能实现了,不过视图函数里面写这么一堆好乱,请问下如何优化这段代码比较好呢,以下代码主要就是通过表单提交的数据,通过 ajax 发送 post 请求到后端,实现修改和新增
@admin.route("/set", methods=['GET', 'POST']) def set_task(): if request.method == 'GET': req = request.args task_id = int(req.get('id', 0)) task_item = None if task_id: task_item = TaskItem.find(task_id) task_cats = TaskCategory.find_all() return render_template('admin/task/edit.html', task_item=task_item, task_cats=task_cats) req = request.values task_id = req['id'] if 'id' in req else '' task_name = req['task_name'] if 'task_name' in req else '' cat_id = int(req['cat_id']) if 'cat_id' in req else '' price = req['price'] if 'price' in req else '' quantity = int(req['quantity']) if 'quantity' in req else '' if task_id: task_item = TaskItem.find(task_id) model_task_item = task_item model_task_item.update_time = get_current_time() else: model_task_item = TaskItem() model_task_item.create_time = get_current_time() model_task_item.name = task_name model_task_item.category_id = cat_id model_task_item.price = price model_task_item.quantity = quantity model_task_item.summary = '' model_task_item.main_image = '' db.session.add(model_task_item) db.session.commit() return Success() 1 BingoXuan 2019 年 2 月 18 日 字典可以用 get 方法来取值,不存在对应的键可以使用默认值。req.get('id','') |
2 awah 2019 年 2 月 18 日 用 class based views, 数据库操作方法抽出来. |
3 metamask 2019 年 2 月 18 日 get,post,update 行为拆开出来 写多一个 def save 来处理 存数据 写多一个子函数 def save_or_update 来处理进来的数据,拼接成数据库对象 如何从 request 拿参数,这个地方参照所使用的框架 |
4 lolizeppelin 2019 年 2 月 18 日 用 jsonschema 来处理 request.args,这样就不用写一堆判断 还有不要用变量 req 来等于 request.args,req 容易误解 |
5 ericls 2019 年 2 月 18 日 fields = [("name", "task_name"), ("category_id", "cat_id"), ...] for attr_name, param_name in fields: setatttr(model_task_item, attr_name, req.get(param_name, "")) |
6 haoxuexiaoyao OP @freakxx 使用的 flask 框架 |
7 haoxuexiaoyao OP @lolizeppelin 谢谢 学习了 |
8 haoxuexiaoyao OP 根据大佬提示,自行搜索了下一个校验库 python-validator,优化后代码如下: ```python @admin.route("/set", methods=['GET', 'POST']) def set_task(): if request.method == 'GET': req = request.args task_id = int(req.get('id', 0)) task_item = None if task_id: task_item = TaskItem.find(task_id) task_cats = TaskCategory.find_all() return render_template('admin/task/edit.html', task_item=task_item, task_cats=task_cats) form_data = request.json v = TaskValidator(form_data) try: v.is_valid(form_data) except ValueError: ParameterException(data=v.str_errors) TaskItem.insert_or_update(form_data['id'], form_data['task_name'], form_data['price'], 'main_image', form_data['quantity'], form_data['cat_id'], 'summary') return Success() ``` @freakxx @lolizeppelin 不知道还有进一步优化空间么 |