2010-09-10 6 views
21

मैं फ्लास्क माइक्रो-फ्रेमवर्क का उपयोग कर रहा हूं जो कि वेर्कज़ुग पर आधारित है, जो पायथन का उपयोग करता है।फ्लास्क/वेर्कजेग, लॉगिन के बाद पिछले पृष्ठ को वापस कैसे करें

प्रत्येक प्रतिबंधित पेज से पहले एक डेकोरेटर सुनिश्चित करने के लिए उपयोगकर्ता के प्रवेश होता है, वर्तमान में उन्हें प्रवेश पृष्ठ पर लौटने अगर वे लॉग इन नहीं हैं, तो जैसे:

# Decorator 
def logged_in(f): 
    @wraps(f) 
    def decorated_function(*args, **kwargs): 
     try: 
      if not session['logged_in']: 
       flash('Please log in first...', 'error') 
       return redirect(url_for('login')) 
      else: 
       return f(*args, **kwargs) 
     except KeyError: 
      flash('Please log in first...', 'error') 
      return redirect(url_for('login')) 
    return decorated_function 


# Login function 
@app.route('/', methods=['GET', 'POST']) 
def login(): 
    """Login page.""" 
    if request.method=='POST': 
    ### Checks database, etc. ### 
    return render_template('login.jinja2') 


# Example 'restricted' page 
@app.route('/download_file') 
@logged_in 
def download_file(): 
    """Function used to send files for download to user.""" 
    fileid = request.args.get('id', 0) 
    ### ... ### 

में प्रवेश करने के बाद, यह की जरूरत है उपयोगकर्ताओं को उस पृष्ठ पर वापस लाने के लिए जो उन्हें लॉगिन पृष्ठ पर ले गया। इसे पास किए गए चर जैसे चीजों को भी बनाए रखने की आवश्यकता है (यानी संपूर्ण लिंक मूल रूप से www.example.com/download_file?id=3)

क्या कोई यह जानता है कि यह कैसे करें?

आपकी मदद :-)

उत्तर

20

मुझे लगता है कि मानक अभ्यास यूआरएल उपयोगकर्ता लॉगिन यूआरएल क्वेरी स्ट्रिंग के अंत में एक सफल प्रवेश के बाद पुनः निर्देशित करने की आवश्यकता है जो करने के लिए संलग्न करने के लिए है के लिए धन्यवाद।

आप (अपने डेकोरेटर समारोह भी हटाया में अतिरिक्तताओं के साथ) कुछ इस तरह करने के लिए अपने डेकोरेटर को बदल देंगे:

def logged_in(f): 
    @wraps(f) 
    def decorated_function(*args, **kwargs): 
     if session.get('logged_in') is not None: 
      return f(*args, **kwargs) 
     else: 
      flash('Please log in first...', 'error') 
      next_url = get_current_url() # However you do this in Flask 
      login_url = '%s?next=%s' % (url_for('login'), next_url) 
      return redirect(login_url) 
    return decorated_function 

आप get_current_url() के लिए कुछ विकल्प होगा, क्योंकि मुझे लगता है कि तरीका बताया गया है पता नहीं है फ्लास्क में किया गया।

फिर, आपके लॉगिन हैंडलर में, जब उपयोगकर्ता सफलतापूर्वक लॉग इन करता है, तो आप यह देखने के लिए जांचते हैं कि अनुरोध में next पैरामीटर है और यदि ऐसा है, तो आप उन्हें उस URL पर रीडायरेक्ट करते हैं। अन्यथा, आप उन्हें कुछ डिफ़ॉल्ट यूआरएल (आमतौर पर /, मुझे लगता है) पर रीडायरेक्ट करते हैं।

+1

+1 फ्लास्क की एक आसान छोटी सुविधा के लिए पहला लिंक भी देखें, अन्यथा ब्लॉक करें – unmounted

+8

get_current_url() flask.request.url है –

11

आप एक फ़ाइल स्ट्रिंग को एक क्लिक या दो पर बरकरार रखने के लिए एक क्वेरी स्ट्रिंग का उपयोग कर सकते हैं। url_for के बारे में अच्छी चीजों में से एक यह है कि यह कैसे passes unknown parameters as query strings है। आप इस तरह से कुछ कर सकते हैं तो बहुत ज्यादा आपके पंजीकरण पृष्ठ को बदले बिना:

def login_required(f): 
    @wraps(f) 
    def decorated_function(*args, **kwargs): 
     if g.user is None: 
      return redirect(url_for('register', wantsurl = request.path)) 
     return f(*args, **kwargs) 
    return decorated_function 

यहाँ wantsurl यूआरएल उपयोगकर्ता पर उतरा पर नज़र रखेंगे। एक अपंजीकृत उपयोगकर्ता /download/some/file.txt लिए चला जाता है, login_required/register?wantsurl=%2Fdownload%2Fsome%2Ffile.txt करने के लिए आप भेज देंगे तो फिर आप अपने पंजीकरण कार्य करने के लिए लाइनों की एक जोड़ी जोड़ें:,

@app.route('/register', methods=['GET', 'POST']) 
def register(): 
    if request.method == 'GET': 
     if 'wantsurl' in request.args: 
      qs = request.args['wantsurl'] 
      return render_template('register.html', wantsurl=qs) 
    if request.method == 'POST': 
     if 'wantsurl' in request.form and everything_else_ok: 
      return redirect(request.form['wantsurl']) 

कि स्वचालित रूप से सफल पंजीकरण पर डाउनलोड करने के लिए पुनर्निर्देशित हैं बशर्ते आप में कुछ है qs के मान के साथ 'wanturl' नामक फ़ॉर्म, या आप अपना फॉर्म क्वेरी स्ट्रिंग के साथ जमा कर सकते हैं; यह टेम्पलेट में थोड़ी सी हो सकती है।

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