2010-09-10 29 views
21

Ben Python kullanan Werkzeug dayanan Flask mikro-framework kullanıyorum. onlar oturum değilse her kısıtlı sayfa ÖnceFlask/Werkzeug, giriş yaptıktan sonra önceki sayfaya nasıl dönülür

kullanıcı giriş sağlamak için bir dekoratör vardır, şu anda aynen böyle giriş sayfasına geri gönderilmesi:

# 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) 
    ### ... ### 

giriş yaptıktan sonra, bu ihtiyacı Kullanıcıları, giriş sayfasına götüren sayfaya geri döndürmek için. Ayrıca geçirilen değişkenler (örneğin, tüm bağlantı temel olarak www.example.com/download_file?id=3)

Bunların nasıl yapıldığını bilen biri var mı?

Ben standart uygulama kullanıcı girişi URL sorgu dizesi sonuna başarılı bir girişten sonra yönlendirilecek kaydetmesi gereken URL'yi eklemek için olduğunu düşünüyorum

cevap

20

:-) Yardımlarınız için teşekkür ederim.

Sen (ayrıca çıkarılmış dekoratör işlevinde işten ile) böyle bir şey için dekoratör değiştirmek istiyorum

: Ben nasıl bilmiyorum çünkü

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 

Sen get_current_url() için bir şeyler yerine gerekecek Flask'ta yapıldı.

Sonra, oturum açma işleyicinizde, kullanıcı başarıyla giriş yaptığında, istekte bir next parametresi olup olmadığını kontrol edersiniz, eğer öyleyse, onları bu URL'ye yönlendirirsiniz. Aksi takdirde, bunları bazı varsayılan URL'lere yönlendirirsiniz (genellikle /, sanırım).

+1

+1 ayrıca şişeyi kullanmanın kullanışlı bir küçük özelliği için ilk bağlantıyı da – unmounted

+8

engelleyin get_current_url() is flask.request.url –

11

Dosya bilgilerini bir veya iki tıklamayla bozulmadan saklamak için bir sorgu dizesi kullanabilirsiniz. url_for ile ilgili güzel şeylerden biri, passes unknown parameters as query strings şeklindedir. Böyle bir şey yapabileceğini çok fazla kayıt sayfanızı değiştirmeden Yani:

İşte wantsurl
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 

kullanıcı indi url takip eder. Eğer bir şey olması koşuluyla,

@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']) 

otomatik Başarılı kayıt üzerinde indirmek için yönlendirir:: kayıtlı olmayan bir kullanıcı /download/some/file.txt giderse, login_required Sonra kayıt fonksiyonuna birkaç satır eklemek /register?wantsurl=%2Fdownload%2Fsome%2Ffile.txt gönderecek form qs değeriyle 'wantsurl' olarak adlandırılır veya formunuzu bir sorgu dizesiyle gönderebilirsiniz; Bu şablonda sadece biraz olsa-olabilir.

İlgili konular