Nie wiem, czy to, czego szukasz, ponieważ już zaakceptowane odpowiedź, ale można usunąć wiele gadatliwości, stosując standardowe techniki refaktoryzacji. Po pierwsze, jeden odpowiedzialność dla każdej funkcji:
@app.route('/create', methods=['GET', 'POST'])
def create_file():
n, t = get_nt_request_data()
return process_n(n)
def get_nt_request_data():
if request.method == 'GET':
return get_nt_query_params()
if request.method == 'POST':
if request.json:
return get_nt_json()
else:
return get_nt_form()
return n, t
def get_nt_query_params():
n = request.args.get('n')
t = request.args.get('t')
return n, t
def get_nt_json():
n = request.json['n']
t = request.json['t']
return n, t
def get_nt_form():
n = request.form['n']
t = request.form['t']
return n, t
def process_n(n):
try:
n = int(n)
except:
n = 1
teraz, to na pewno nie krócej, ale osobiście uważam, że jest znacznie jaśniejsze. Każda pojedyncza funkcja ma jasno określony cel i nie jest zagracona. Osobiście wprowadzę "n, t" do obiektu z dwoma polami, ale to zależy od ciebie i od tego, co działa dla twojej aplikacji. Krok 2: mamy tu dość oczywiste kopiowanie/wklejanie. Oczyśćmy to.
@app.route('/create', methods=['GET', 'POST'])
def create_file():
n, t = get_nt_request_data()
return process_n(n)
def get_nt_request_data():
if request.method == 'GET':
return get_nt_query_params()
if request.method == 'POST':
if request.json:
return get_nt_json()
else:
return get_nt_form()
return n, t
def get_nt_query_params():
return build_nt(request.args)
def get_nt_json():
return build_nt(request.json)
def get_nt_form():
return build_nt(request.form)
def build_nt(resource):
return resource.get("n"), resource.get("t")
def process_n(n):
try:
n = int(n)
except:
n = 1
Teraz docieramy gdzieś! Ale jeśli zrobimy to dla 20 różnych zasobów (zakładając, że twoje różne punkty końcowe będą zgodne z podobnymi regułami dla czasowników HTTP), będziemy mieć garść funkcji get_xx_request_data, które w zasadzie robią to samo. Sparametryzujmy!
@app.route('/create', methods=['GET', 'POST'])
def create_file():
n, t = get_request_data(build_nt)
return process_n(n)
def build_nt(resource):
return resource.get("n"), resource.get("t")
def process_n(n):
try:
n = int(n)
except:
n = 1
# in a shared module somewhere
def get_request_data(builder):
if request.method == 'GET':
return builder(request.args)
if request.method == 'POST':
if request.json:
return builder(request.json)
else:
return builder(request.form)
return n, t
Nawet 11 linii kodu dla punktu końcowego i funkcja współdzielona, którą można ponownie wykorzystać dla innych. (Zakładam, że jest to koncepcyjnie podobne do tego, co robią dostępne frameworki, nie miałem okazji ich sprawdzić.)
Ostatnia uwaga: utworzenie pliku z żądaniem GET przyniesie ci trochę podniosłem brwi i prawdopodobnie jakieś dziwne błędy w zależności od tego, jak dużo kontroli nad klientami i pośredniczącymi proxy. GET ma być idempotent, więc klienci powinni być w stanie powtórzyć je wszystkie chcąc nie chcąc, nie oczekując żadnych zmian stanu na serwerze (i tworzenie czegoś jest zdecydowanie zmianą stanu). Teoretycznie, serwer proxy powinien móc ponownie odtwarzać polecenie GET po czemsie sieci, nawet nie informując pierwotnego klienta, że próbował dwa razy, ale w praktyce nigdy nie sprawiał mi kłopotów.
Zazwyczaj przenosimy moje metody API do osobnego schematu niż moje metody sieciowe. W ten sposób funkcjonalność nie zakłóca się nawzajem i pozwala na łatwiejszą konserwację. Chciałbym również spojrzeć na [flask-RESTful] (http://flask-restful.readthedocs.org/en/latest/) – sean
Będą musiały spojrzeć dalej w projekty. Na razie zdecydowałem się na odpowiedź @ Miguela. Dzięki. – iandexter