2015-10-26 8 views
8

मैं अपने फ्लास्क ऐप को अपने स्वयं के विचारों से एक पोस्ट अनुरोध भेजने की कोशिश कर रहा हूं, लेकिन जब तक मैं सर्वर को मार नहीं जाता तब तक यह लटकता है। अगर मैं जावास्क्रिप्ट में अनुरोध करता हूं, तो यह ठीक काम करता है। यह पायथन कोड से क्यों काम नहीं करता है?फ्लास्क खुद को एक पोस्ट अनुरोध भेजते समय लटकता है

from flask import Blueprint, render_template, abort, request, Response, session, url_for 
from jinja2 import TemplateNotFound 

from flask.ext.wtf import Form 
from wtforms import BooleanField, TextField, PasswordField 

import requests 

login = Blueprint('login', __name__, template_folder='templates') 

class LoginForm(Form): 
    email = TextField('Email') 
    password = PasswordField('Password') 

@login.route('/login', methods=['GET', 'POST']) 
    def _login(): 

    form = LoginForm(request.form, csrf_enabled=False) 

    if form.validate_on_submit(): 
     return requests.post(request.url_root + '/api/login', data={"test": True}) 


    return render_template('login.html', form=form) 

उत्तर

17

फ्लास्क का विकास सर्वर डिफ़ॉल्ट रूप से सिंगल-थ्रेडेड है। यह केवल एक ही समय में एक अनुरोध को संभाल सकता है। अनुरोध प्राप्त होने तक अनुरोध ब्लॉक बनाना। आपका फ्लास्क कोड एक थ्रेड में अनुरोध करता है, और फिर प्रतीक्षा करता है। इस दूसरे अनुरोध को संभालने के लिए कोई अन्य धागे नहीं हैं। तो अनुरोध कभी पूरा नहीं होता है, और मूल अनुरोध हमेशा के लिए इंतजार कर रहा है।

डेडलॉक से बचने और तत्काल समस्या को ठीक करने के लिए dev सर्वर पर एकाधिक थ्रेड या प्रक्रियाओं को सक्षम करें।

app.run(threaded=True) 
# or 
app.run(processes=2) 

हालांकि, ऐप के भीतर से ऐप को पूर्ण HTTP अनुरोध करना आवश्यक नहीं होना चाहिए और एक गहरी डिज़ाइन समस्या इंगित करता है। उदाहरण के लिए, देखें कि आंतरिक अनुरोध के पास क्लाइंट के ब्राउज़र पर सत्र तक पहुंच नहीं होगी। एक नया अनुरोध करने के बजाय, सामान्य कोड निकालें और इसे आंतरिक रूप से कॉल करें।

+1

मैं काफी आश्चर्यचकित हूं। जहां भी मैं जाता हूं, मैं हमेशा सुनता हूं कि फ्लास्क बहु-थ्रेडिंग का समर्थन नहीं करता है। अपने आवेदन की सेवा के लिए हमेशा बंदूक और/या nginx का उपयोग करें। सबक सीखा, हमेशा उन्हें मंजूर करने से पहले चेक सामान पार कर जाएगा :) –

+1

@ अहिरथ माहिपाल गुनीकोर्न और निजिनक्स का उपयोग करने की सलाह सही है। फ्लास्क सर्वर, जबकि यह धागे का समर्थन करता है, उत्पादन के लिए नहीं है। यह कुशल, स्थिर, या सुरक्षित होने के लिए डिज़ाइन नहीं किया गया है, इसे केवल विकास के दौरान स्थानीय रूप से उपयोग किया जाना चाहिए। – davidism

+0

@ डेविडिज्म सहमत हुए। मेरा मतलब यह है कि सुनने के बाद मैंने कभी फ्लेस्क को थ्रेडेड विकल्प रखने की संभावना पर विचार नहीं किया। –

0

मैं फ्लास्क से परिचित नहीं हूं। हालांकि कोड के इस बिट:

if form.validate_on_submit(): 
    return requests.post(request.url_root + '/api/login', data={"test": True}) 

लगता है आप एक पोस्ट फार्म स्वीकार करने की तरह कर रहे हैं, यह सत्यापित करने, और फिर इसे फिर से पोस्ट। बार बार।

+0

यूआरएल अलग दिखते हैं: दूसरे में '/ api' उपसर्ग है। यह थ्रेड डेडलॉक के कारण है, अनंत लूप नहीं। – davidism

+0

@ डेविडिज्म जबकि मुझे पूरा यकीन है कि आप सही हैं ... 'app.register_blueprint (लॉगिन, उपसर्ग ="/एपीआई ") 'एक अनंत पाश उत्पन्न करेगा ... लेकिन जैसा कि मैंने कहा था मुझे यकीन है कि आप इस बारे में हैं मुद्दा यह है कि ओपी देख रहा है ... –

+0

@ जोरनबेस्ले अच्छा बिंदु, ओप वास्तव में यह नहीं दिखाता कि ब्लूप्रिंट कैसे पंजीकृत था। मुझे लगता है कि ब्राउजर अभी भी इस मामले में एक अनंत रीडायरेक्ट लूप के बारे में चेतावनी देगा। – davidism

संबंधित मुद्दे