কীভাবে একটি ব্লুপ্রিন্টে app.config অ্যাক্সেস করবেন?


114

আমি authorisation.pyপ্যাকেজ এপিআই-তে একটি ব্লুপ্রিন্টের ভিতরে অ্যাক্সেস অ্যাপ্লিকেশন কনফিগারেশন অ্যাক্সেস করার চেষ্টা করছি । আমি যে নীলনকশাটি __init__.pyব্যবহার করা হচ্ছে তা আরম্ভ করছি authorisation.py

__init__.py

from flask import Blueprint
api_blueprint = Blueprint("xxx.api", __name__, None)
from api import authorisation

authorisation.py

from flask import request, jsonify, current_app

from ..oauth_adapter import OauthAdapter
from api import api_blueprint as api

client_id = current_app.config.get('CLIENT_ID')
client_secret = current_app.config.get('CLIENT_SECRET')
scope = current_app.config.get('SCOPE')
callback = current_app.config.get('CALLBACK')

auth = OauthAdapter(client_id, client_secret, scope, callback)


@api.route('/authorisation_url')
def authorisation_url():
    url = auth.get_authorisation_url()
    return str(url)

আমি রানটাইম এরির পাচ্ছি: অ্যাপ্লিকেশন প্রসঙ্গে বাইরে কাজ করা

আমি বুঝতে পারি কেন এটি তবে তবে সেই কনফিগারেশন সেটিংস অ্যাক্সেস করার সঠিক উপায় কী?

---- আপডেট ---- অস্থায়ীভাবে, আমি এটি করেছি।

@api.route('/authorisation_url')
def authorisation_url():
    client_id, client_secret, scope, callback = config_helper.get_config()
    auth = OauthAdapter(client_id, client_secret, scope, callback)
    url = auth.get_authorisation_url()
    return str(url)

উত্তর:


133

ব্লুপ্রিন্ট দৃশ্যের flask.current_appজায়গায় ব্যবহার করুন app

from flask import current_app

@api.route("/info")
def get_account_num():
    num = current_app.config["INFO"]

current_appপ্রক্সি একটি প্রেক্ষাপটে কেবল প্রাপ্তিসাধ্য অনুরোধ


25
নোট করুন যে current_appপ্রক্সিটি কেবলমাত্র একটি অনুরোধের প্রসঙ্গে উপলব্ধ।
সেপহর

1
@ সেফার অন্যান্য অনুরোধ থেকে এই অনুরোধের প্রসঙ্গে কীভাবে অ্যাক্সেস করবেন সে সম্পর্কে কোনও টিপস (এটি কোনও প্যারামিটার হিসাবে পাস না করে, তবে কিছু ধরণের গ্লোবাল প্যারামিটার হিসাবে)?
কারকড

21

ওভারলোডিং recordপদ্ধতিটি বেশ সহজ বলে মনে হচ্ছে:

api_blueprint = Blueprint('xxx.api',  __name__, None)
api_blueprint.config = {}

@api_blueprint.record
def record_params(setup_state):
  app = setup_state.app
  api_blueprint.config = dict([(key,value) for (key,value) in app.config.iteritems()])

1
পাইথন 3 ব্যবহারের জন্য: app.config.iteitems () এর পরিবর্তে app.config.items ()
ধোতজাই

1
হাই, আমার কি রেকর্ড_প্রেমগুলি চাওয়ার বা নিবন্ধকরণ করার দরকার আছে, আমি চেষ্টা করেছি কিন্তু এটি কার্যকর হয়নি। অনেক ধন্যবাদ.
mrblue

আপনার যদি কোনও অ্যাপে অ্যাক্সেসের প্রয়োজন হয় (উদাহরণস্বরূপ ব্লুপ্রিন্ট সেট করার জন্য কনফিগারেশন পাওয়া) এটি দুর্দান্ত!
পিটার লাদা

12

টিবিসিরের উত্তরটি তৈরি করতে , registerপদ্ধতির উদাহরণটিকে ওভাররাইড করার জন্য এখানে একটি উদাহরণ দেওয়া হয়েছে :

from flask import Blueprint

auth = None

class RegisteringExampleBlueprint(Blueprint):
    def register(self, app, options, first_registration=False):
        global auth

        config = app.config
        client_id = config.get('CLIENT_ID')
        client_secret = config.get('CLIENT_SECRET')
        scope = config.get('SCOPE')
        callback = config.get('CALLBACK')

        auth = OauthAdapter(client_id, client_secret, scope, callback)

        super(RegisteringExampleBlueprint,
              self).register(app, options, first_registration)

the_blueprint = RegisteringExampleBlueprint('example', __name__)

এবং recordশোভাকর ব্যবহার করে একটি উদাহরণ :

from flask import Blueprint
from api import api_blueprint as api

auth = None

# Note there's also a record_once decorator
@api.record
def record_auth(setup_state):
    global auth

    config = setup_state.app.config
    client_id = config.get('CLIENT_ID')
    client_secret = config.get('CLIENT_SECRET')
    scope = config.get('SCOPE')
    callback = config.get('CALLBACK')

    auth = OauthAdapter(client_id, client_secret, scope, callback)

'@ api.record' আমার পক্ষে কাজ করে না,। 'এপিআই' কোন নেমস্পেসের?
টিম রিচার্ডসন

দুঃখিত, প্রশ্নটির লাইন থেকে এটি অনুলিপি করেন নিfrom api import api_blueprint as api
কাইল জেমস ওয়াকার

7

ব্লুপ্রিন্টগুলির এমন একটি registerপদ্ধতি রয়েছে যা আপনাকে ব্লুপ্রিন্ট নিবন্ধন করার সময় ডাকে । সুতরাং আপনি এই পদ্ধতিটিকে ওভাররাইড করতে পারেন বা যুক্তিটি বর্ণনা করতে recordডেকরেটার ব্যবহার করতে পারেন যা থেকে নির্ভর করে app


4

current_appপদ্ধতির জরিমানা কিন্তু আপনি কিছু অনুরোধ প্রসঙ্গ থাকতে হবে। যদি আপনার কাছে না থাকে (পরীক্ষার মতো কিছু প্রাক-কাজ, উদাহরণস্বরূপ) আপনি আরও ভাল জায়গা করে নিতে পারেন

with app.test_request_context('/'):

এই current_appকল করার আগে

RuntimeError: working outside of application contextপরিবর্তে আপনার হবে।


3
অ্যাপটি কোনও কারখানায় তৈরি করা হয় এবং সেইজন্য 'অ্যাপ' (বা যাকেই ফ্লাস্ক অ্যাপ বলা হয়) আমদানি করার জন্য পাওয়া যায় না সে সম্পর্কে কী হবে? অনুরোধগুলির অভ্যন্তরে এটি কোনও সমস্যা নয় কারণ অনুরোধের সময় একটি অ্যাপ্লিকেশন প্রসঙ্গ থাকে, তবে যখন অ্যাপ্লিকেশন কনফিগারেশনের প্রয়োজন হয় এমন অনুরোধ যুক্তির বাইরে অংশগুলি সংজ্ঞায়িত করার সময়। আপনি প্রসঙ্গ তৈরি করতে অ্যাপটি ব্যবহার করতে না পারলে কীভাবে একটি অ্যাক্সেস অ্যাপ কনফিগারেশন করতে পারে?
রবার্তো কিউবা


3

আপনাকে হয় মূল appভেরিয়েবল (বা আপনি যা বলেছিলেন) আমদানি করতে হবে যা দ্বারা ফিরে এসেছে Flask():

from someplace import app
app.config.get('CLIENT_ID')

বা অনুরোধের মধ্যে থেকে এটি করুন:

@api.route('/authorisation_url')
def authorisation_url():
    client_id = current_app.config.get('CLIENT_ID')
    url = auth.get_authorisation_url()
    return str(url)

4
হ্যাঁ, আমি দুজনের কোনওটিই করতে চাইনি। প্রথমটি ক্রস রেফারেন্স তৈরি করছে এবং দ্বিতীয় পদ্ধতিটি ডিআরওয়াই নয়।
চিরদীপ তোমার

2
@ চির্দীপটোমার যদি প্রথম দৃষ্টিভঙ্গি বিজ্ঞপ্তি আমদানি তৈরি করে (তবে অ্যাপটি ভেঙে দেয়) তবে আপনার অ্যাপটি কীভাবে কাঠামোগত করা হয়েছে তাতে কিছু ভুল আছে।
ড্যানিয়েল চ্যাটফিল্ড

13
@ ড্যানিয়েল চ্যাটফিল্ড যা সত্য তা সত্য নয়। অ্যাপ্লিকেশন অবজেক্টটি সেই বস্তু যা ব্লুপ্রিন্টগুলি নিবন্ধন করে। বোঝা যায় যে এটি সঠিক নীল নকশা তারপর অ্যাপ্লিকেশন অবজেক্টের আমদানি করতে জন্য হবে সবসময় একটি বৃত্তাকার নির্ভরতা হতে পারে। সঠিক কৌশলটির জন্য অন্যান্য উত্তর দেখুন।
21

@ শোলস্যাপ আমি জানি এটি একটি বিজ্ঞপ্তি আমদানি তৈরি করবে (যেমন এটি ফ্লাস্ক ডক্সে রয়েছে : flask.pocoo.org/docs/patterns/packages ), আমি বললাম যদি এটি একটি বিজ্ঞপ্তি আমদানি তৈরি করে যা অ্যাপ্লিকেশনটিকে ভেঙে দেয়
ড্যানিয়েল চ্যাটফিল্ড

1

আপনি কোনও ফাংশনে ব্লুপ্রিন্ট মোড়তে এবং পাস করতে পারেন app যুক্তি হিসাবে :

ব্লুপ্রিন্ট:

def get_blueprint(app):
    bp = Blueprint()
    return bp

প্রধান:

from . import my_blueprint
app.register_blueprint(my_blueprint.get_blueprint(app))

আমি এটি চেষ্টা করেছিলাম তবে আমি একটি "অভ্যন্তরীণ সার্ভার ত্রুটি" পেয়েছি।
MD004

এই পদ্ধতির সাথে কোন ত্রুটি?
টুকু মস্তোনেন

@ টুকুকা: আমার কোনও বিশেষ অসুবিধা মনে নেই, আমি এটি ব্যবহার করার পরে অনেকটা দীর্ঘ হয়েছে been ব্যবহার করে কিছু সুবিধা থাকতে পারেflask.current_appআপনি একাধিক অ্যাপে ব্লুপ্রিন্ট ব্যবহার করার সময় । আমি পরামর্শ দিচ্ছি যদি এই পদ্ধতির ব্যবহারটি আপনার সমস্যাগুলি সমাধান করে তবে ফ্লাস্ক কোনও নির্দিষ্ট পদ্ধতির প্রয়োগ করে না।
জর্জি স্কলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.