Может ли функция определять переменные экземпляра при вызове внутри функции в Python? - PullRequest
0 голосов
/ 22 января 2019

У меня есть колба с множеством функций с дубликатами. Чтобы упростить код, я хочу вызвать вспомогательную функцию вместо повторения кода, включая определения переменных.

@app.route('/update_report', methods=["POST"])
def update_report():
    m_log_no = request.form.get('log_no')
    m_ip_address = request.form.get('ip_address')
    m_report_reason = request.form.get('report_reason')
    m_status_code = request.form.get('status_code')
    ...
@app.route('/delete_report', methods=["POST"])
def delete_report():
    m_log_no = request.form.get('log_no')
    m_user_id= request.form.get('user_id')
    ...

У меня есть сотни подобных функций. Я хотел бы упростить его, используя вспомогательную функцию для определения переменных экземпляра:

def helper_function(*args)
    for arg in args:
        # Work some magic of sorts:
        # super.m_arg = request.form.get(arg)

@app.route('/update_report', methods=["POST"])
def update_report():
    parameter_list = ('log_no', 'ip_address', 'report_reason', 'status_code')
    helper_function(*parameter_list)

Возможно ли подобное действие?

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Одним из способов является отправка request вспомогательной функции.Возвращает словарь, содержащий параметры и значения формы из вспомогательной функции.

Вот демонстрация этой концепции:

app.py:

from flask import Flask, render_template, request, jsonify

app = Flask(__name__)

def helper_function(flask_request, args):
    data = {}
    for arg in args:
        data[arg] = flask_request.form.get(arg)
    return data

@app.route('/update_report', methods=["POST"])
def update_report():
    parameter_list = ('log_no', 'ip_address')
    data = helper_function(request, parameter_list)
    return jsonify(data)

@app.route('/delete_report', methods=["POST"])
def delete_report():
    parameter_list = ('log_no', 'user_id')
    data = helper_function(request, parameter_list)
    return jsonify(data)


@app.route('/', methods=["GET"])
def view_reports():
    return render_template("form.html")

if __name__ == '__main__':
    app.run(debug=True)

form.html:

<html>
    <head>
        <title>Form</title>     
    </head>
    <body>
        <h3>Update report</h3>
        <form action="/update_report" method="post">
            Log No: <input name="log_no" /> <br>
            IP Address: <input name="ip_address" /> <br>
            <input type="submit" value="Update" />
        </form>             
        <hr>
        <h3>Delete report</h3>
        <form action="/delete_report" method="post">
            Log No: <input name="log_no" /> <br>
            User ID: <input name="user_id" /> <br>
            <input type="submit" value="Delete" />
        </form>             
    </body>
</html>

Вывод:

  • Рис. 1. Вид формы перед вызовом обновления или удаления маршрута form view

  • Рисунок 2: Ответ после вызова маршрута обновления output_from_helper

0 голосов
/ 22 января 2019

Вы делаете что-то в этих строках, если вам это нужно.

class FormData(object):

    # Using __init__ as per bruno's comment
    def __init__(self, parameters_list, data_object, *args, **kwargs):
        for form_key_item in parameters_list:
            setattr(self, "m_{key_name}".format(key_name=form_key_item), data_object.get(form_key_item))


    # Custom method
    def set_args(self, parameters_list, data_object):
        for form_key_item in parameters_list:
            setattr(self, "m_{key_name}".format(key_name=form_key_item), data_object.get(form_key_item))

И используйте это как

def some_method():
    # While using the custom method for setting values
    # Create your data instance
    your_data_object = FormData()
    # Set the value for the attributes on instance
    your_data_object.set_args(parameters_list, request.form)

    # While using the __init__ method
    your_data_object = FormData(parameters_list, request.form)

    # Use it like
    print(your_data_object.m_log_no)

P.S: это черновик, который вы можете использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...