2014-12-22 6 views
7

मैं उपयोगकर्ताओं को लॉग इन करने के लिए फ़ाइलों को उपलब्ध कराने के लिए प्रतिबंधित करना चाहता हूं, लेकिन अन्यथा 403 त्रुटि या इसी तरह की वापसी करता हूं। उदाहरण के लिए, यदि उपयोगकर्ता लॉग इन हैं तो /static/data/example.csv को केवल /static/data/example.csv देखने/डाउनलोड करने में सक्षम होना चाहिए।उपयोगकर्ताओं में लॉग इन करने के लिए स्थिर फ़ाइल पहुंच प्रतिबंधित करें

मुझे पता है कि फ्लास्क-लॉगिन का उपयोग करके फ़ाइलों के वास्तविक प्रदर्शन को नियंत्रित करने के तरीके को कैसे नियंत्रित किया जाए, अगर वे लॉग इन नहीं हैं, लेकिन नहीं फ़ाइल तक पहुंच को अवरुद्ध करने के लिए यदि वे सीधे अपने ब्राउज़र में लिंक पर जाते हैं।

+2

सुनिश्चित नहीं हैं कि अगर यह यह करने के लिए सबसे अच्छा तरीका है, लेकिन मैं आम तौर पर बोतल के माध्यम से फ़ाइलों की सेवा और (nginx के माध्यम से दुर्गम उन फ़ाइलों को बनाने के यानी, उन्हें स्थैतिक फ़ोल्डर में न रखें)। इस तरह आप फ्लास्क-लॉगिन के साथ पहुंच नियंत्रित करते हैं। यह लिंक सहायक हो सकता है: http://flask.pocoo.org/docs/0.10/patterns/streaming/ – Gohn67

+0

धन्यवाद गोहन 67, मैंने आपको तब तक स्थिर फ़ोल्डर से बाहर जाने का विचार नहीं किया जब तक आपने इसका उल्लेख नहीं किया। – iamlolz

+1

आपकी गोपनीयता चिंताओं के आधार पर, आप प्रमाणीकरण से संबंधित कुकी की उपस्थिति के लिए nginx जांच कर सकते हैं और केवल मिलने पर स्थिर फाइलों की सेवा कर सकते हैं। – dirn

उत्तर

13

बोतल adds a static route स्टैटिक फ़ाइलें सेवा करने के लिए। जब आप उत्पादन में होते हैं, तो आप आमतौर पर इस मार्ग को "शॉर्ट सर्किट" करते हैं ताकि निगेंक्स आपके ऐप पर अनुरोध से पहले फाइलों परोसता है। इस "शॉर्ट सर्किट" को जोड़ने के बजाय, इसे छोड़ दें और फ्लास्क अनुरोधों को संभालने दें। Flask-Login's login_required द्वारा लिपटे एक के साथ स्थिर मार्ग को ओवरराइट करें।

from flask_login import login_required 

app.view_functions['static'] = login_required(app.send_static_file) 

यह हालांकि आम तौर पर overkill है, क्योंकि आप चाहते हैं सही मायने में स्थिर फ़ाइलों कोई बात नहीं क्या उन में इतना है कि पृष्ठों के लिए सही लग रही गैर लॉग इन (अन्यथा सीएसएस भी के लिए भेजा जा नहीं होगा पेश किए जाएं, लॉगिन वाला पन्ना)। इसके बजाय, "शॉर्ट सर्किट" स्थिर फ़ोल्डर को Nginx द्वारा परोसा जाता है, और एक मार्ग परिभाषित करता है जो किसी अन्य निर्देशिका से सुरक्षित फ़ाइलों को सुरक्षित करेगा, जैसे इंस्टेंस फ़ोल्डर। flask.send_from_directory देखें।

import os 
from flask import send_from_directory 
from flask_login import login_required 

@app.route('/protected/<path:filename>') 
@login_required 
def protected(filename): 
    return send_from_directory(
     os.path.join(app.instance_path, 'protected'), 
     filename 
    ) 

यह उपयोगकर्ताओं को केवल में लॉग इन करने के लिए निर्देशिका "संरक्षित" instance folder में से फाइल में काम करेगा। अन्य प्रतिबंध भी जोड़े जा सकते हैं, जैसे कुछ निश्चित उपयोगकर्ताओं को कुछ फ़ाइलों तक पहुंचने की अनुमति देना। स्थिर पथ के समान, आप के साथ एक फ़ाइल के लिए एक यूआरएल उत्पन्न कर सकते हैं:

url_for('protected', filename='data/example.csv') 
संबंधित मुद्दे

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