V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
haoxuexiaoyao
V2EX  ›  Python

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

  •  
  •   haoxuexiaoyao · 2019-02-18 14:25:56 +08:00 · 2427 次点击
    这是一个创建于 2107 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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


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

    还有不要用变量 req 来等于 request.args,req 容易误解
    ericls
        5
    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
        6
    haoxuexiaoyao  
    OP
       2019-02-18 17:49:47 +08:00
    @freakxx 使用的 flask 框架
    haoxuexiaoyao
        7
    haoxuexiaoyao  
    OP
       2019-02-18 17:50:35 +08:00
    @lolizeppelin 谢谢 学习了
    haoxuexiaoyao
        8
    haoxuexiaoyao  
    OP
       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
    不知道还有进一步优化空间么
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2750 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 00:21 · PVG 08:21 · LAX 16:21 · JFK 19:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.