Python 新手,这段代码怎么写比较优雅,求指导

2019-02-18 14:25:56 +08:00
 haoxuexiaoyao

刚刚学习 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()
2256 次点击
所在节点    Python
8 条回复
BingoXuan
2019-02-18 14:46:03 +08:00
字典可以用 get 方法来取值,不存在对应的键可以使用默认值。req.get('id','')
luguhu
2019-02-18 14:50:42 +08:00
用 class based views, 数据库操作方法抽出来.
freakxx
2019-02-18 14:57:38 +08:00
get,post,update 行为拆开出来

写多一个
def save 来处理 存数据

写多一个子函数
def save_or_update 来处理进来的数据,拼接成数据库对象


如何从 request 拿参数,这个地方参照所使用的框架
lolizeppelin
2019-02-18 14:59:18 +08:00
用 jsonschema 来处理 request.args,这样就不用写一堆判断

还有不要用变量 req 来等于 request.args,req 容易误解
ericls
2019-02-18 15:19:13 +08:00
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, ""))
haoxuexiaoyao
2019-02-18 17:49:47 +08:00
@freakxx 使用的 flask 框架
haoxuexiaoyao
2019-02-18 17:50:35 +08:00
@lolizeppelin 谢谢 学习了
haoxuexiaoyao
2019-02-19 12:19:56 +08:00
根据大佬提示,自行搜索了下一个校验库 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
不知道还有进一步优化空间么

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/536110

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX