সমস্ত ফ্লাস্ক রুটে একটি উপসর্গ যুক্ত করুন


103

আমার একটি উপসর্গ রয়েছে যা আমি প্রতিটি রুটে যুক্ত করতে চাই। এখনই আমি প্রতিটি সংজ্ঞায় রুটটিতে একটি ধ্রুবক যুক্ত করি add এটি স্বয়ংক্রিয়ভাবে করার উপায় আছে?

PREFIX = "/abc/123"

@app.route(PREFIX + "/")
def index_page():
  return "This is a website about burritos"

@app.route(PREFIX + "/about")
def about_page():
  return "This is a website about burritos"

উত্তর:


77

উত্তর আপনি কীভাবে এই অ্যাপ্লিকেশনটি পরিবেশন করছেন তার উপর নির্ভর করে।

অন্য একটি ডাব্লুএসজিআই ধারকটির ভিতরে সাব-মাউন্ট করা

ধরে নিই যে আপনি এই অ্যাপ্লিকেশনটি ডাব্লুএসজিআই কনটেইনার (মোড_উসগি, ইউউজি, গুনিকর্ন, ইত্যাদি) এর ভিতরে চালাচ্ছেন; আপনি আসলে প্রয়োজন সেই প্রেফিক্স এ মাউন্ট যে WSGI ধারক এর একটি উপ-অংশ এবং আপনার সেট করতে (যে কিছু WSGI কি করতে হবে বলে) নামে আবেদন APPLICATION_ROOTআপনার উপসর্গ থেকে কনফিগ মান:

app.config["APPLICATION_ROOT"] = "/abc/123"

@app.route("/")
def index():
    return "The URL for this page is {}".format(url_for("index"))

# Will return "The URL for this page is /abc/123/"

APPLICATION_ROOTকনফিগার মানটি সেট করা ফ্লাস্কের সেশন কুকিকে সেই URL উপসর্গের মধ্যে সীমাবদ্ধ করে। ফ্ল্যাস্ক এবং ওয়ার্কজিগের দুর্দান্ত ডাব্লুএসজিআই হ্যান্ডলিংয়ের ক্ষমতা দ্বারা আপনার জন্য সমস্ত কিছু স্বয়ংক্রিয়ভাবে পরিচালিত হবে।

আপনার অ্যাপটিকে সঠিকভাবে উপ-মাউন্ট করার একটি উদাহরণ

প্রথম অনুচ্ছেদটির অর্থ কী আপনি যদি নিশ্চিত না হন তবে এর অভ্যন্তরে ফ্ল্যাস্ক লাগানো এই উদাহরণ প্রয়োগটি দেখুন:

from flask import Flask, url_for
from werkzeug.serving import run_simple
from werkzeug.wsgi import DispatcherMiddleware

app = Flask(__name__)
app.config['APPLICATION_ROOT'] = '/abc/123'

@app.route('/')
def index():
    return 'The URL for this page is {}'.format(url_for('index'))

def simple(env, resp):
    resp(b'200 OK', [(b'Content-Type', b'text/plain')])
    return [b'Hello WSGI World']

app.wsgi_app = DispatcherMiddleware(simple, {'/abc/123': app.wsgi_app})

if __name__ == '__main__':
    app.run('localhost', 5000)

অ্যাপটিতে প্রক্সিংয়ের অনুরোধগুলি

অন্যদিকে, আপনি যদি তার ডাব্লুএসজিআই ধারকটির মূলে আপনার ফ্লাস্ক অ্যাপ্লিকেশনটি চালাচ্ছেন এবং এটির জন্য প্রক্সিং অনুরোধগুলি (উদাহরণস্বরূপ, যদি এটি ফাস্টসিজিআই করা হচ্ছে, অথবা যদি এনজিনেক্স proxy_passএকটি সাব-এন্ডপয়েন্টের জন্য অনুরোধ করছে) আপনার একা uwsgi/ geventসার্ভার থেকে তারপর আপনি করতে পারেন:

  • মিগুয়েল তার উত্তরে উল্লেখ করেছেন বলে একটি নীলনকশা ব্যবহার করুন ।
  • বা ব্যবহার DispatcherMiddlewareথেকে werkzeug(অথবা PrefixMiddlewareথেকে su27 এর উত্তর করার জন্য) উপ-মাউন্ট আপনি ব্যবহার করছেন অনুষঙ্গহীন WSGI সার্ভার আপনার আবেদন। ( কোডটি ব্যবহারের জন্য উপরে আপনার অ্যাপকে যথাযথভাবে উপ-মাউন্ট করার উদাহরণ দেখুন )।

@jknupp - দিকে তাকিয়ে flask.Flask#create_url_adapterএবং werkzeug.routing.Map#bind_to_environএটা পছন্দ দেখে মনে হচ্ছে উচিত কাজ - কিভাবে আপনি কোড চলমান করছিলে? ( url_forপ্রত্যাশিত মানটি ফেরত দেওয়ার জন্য অ্যাপ্লিকেশনটিকে ডাব্লুএসজিআই পরিবেশে সাব-পাথের উপরে আসলে মাউন্ট করা দরকার ))
সান ভায়েরা

আপনি যা লিখেছিলেন ঠিক তেমনই আমি দৌড়েছি, তবে অ্যাপ্লিকেশন = ফ্লাস্ক ( নাম ) এবং অ্যাপ.আরুন (ডিবাগ = ট্রু) যুক্ত করেছেন
জেফকনাপ্প

4
@ জেকনুপ - এটাই সমস্যা - আপনাকে অবশ্যই অ্যাপ্লিকেশনটিকে বৃহত্তর অ্যাপ্লিকেশনটির উপ-অংশ হিসাবে (মাউন্ট ডাব্লুএসজিআই বলে যে কিছু করতে হবে) হিসাবে মাউন্ট করতে হবে। আমি একটি উদাহরণ টুকরো টুকরো করে জানিয়েছি এবং আমার উত্তরটি এটি পরিষ্কার করে তুলতে আপডেট করেছি যে আমি একটি সাব-মাউন্টড ডাব্লুএসজিআই পরিবেশ অনুমান করছি, যে প্রক্সিটির পিছনে স্থায়ী একা ডাব্লুএসজিআই পরিবেশ নেই যা কেবলমাত্র সাব-পাথের অনুরোধগুলি ফরওয়ার্ড করছে।
সান ভিয়েরা

4
এটি DispatcherMiddlewareনিজেই ফ্লাস্ক চালানোর সময় এপ্রোচটি ব্যবহার করে কাজ করে। গুনিকর্নের পিছনে দৌড়ানোর সময় এই কাজটি করার বিষয়টি বেশ মনে হচ্ছে না।
জাস্টিন

4
উউসগিতে সাব পাথের পথে মাউন্ট uwsgi -s /tmp/yourapplication.sock --manage-script-name --mount /yourapplication=myapp:app। বিশদটি (উউসগি ডকুমেন্ট) দেখুন [ flask.pocoo.org/docs/1.0/deploying/uwsgi/]
আজকে জানুয়ারী

101

আপনি আপনার রুটগুলি একটি নীল ছাপে রাখতে পারেন:

bp = Blueprint('burritos', __name__,
                        template_folder='templates')

@bp.route("/")
def index_page():
  return "This is a website about burritos"

@bp.route("/about")
def about_page():
  return "This is a website about burritos"

তারপরে আপনি একটি উপস ব্যবহার করে অ্যাপ্লিকেশনটির সাথে ব্লুপ্রিন্টটি নিবন্ধ করুন:

app = Flask(__name__)
app.register_blueprint(bp, url_prefix='/abc/123')

4
হাই মিগুয়েল; আপনি নীচের সাথে একটি ব্লুপ্রিন্টের জন্য url_prefix নিবন্ধকরণের app.register_blueprintমধ্যে এবং উপরের ব্লুপ্রিন্ট অবজেক্টটি তাত্ক্ষণিকভাবে ইনস্ট্যান্ট করার সময় নিবন্ধকরণের মধ্যে পার্থক্য জানেন url_prefix='/abc/123? ধন্যবাদ!
আড়ালার

4
পার্থক্যটি হ'ল যে register_blueprintকলটিতে ইউআরএল উপসর্গ থাকা অ্যাপ্লিকেশনটিকে নীলনকশাটি যে কোনও জায়গায় "মাউন্ট" করার স্বাধীনতা দেয় বা এমনকি বিভিন্ন ইউআরএলে একই নীলনকশাটি একাধিকবার মাউন্ট করার স্বাধীনতা দেয়। আপনি যদি নীল ছাপে উপসর্গটি নিজের মধ্যে রাখেন তবে আপনি অ্যাপ্লিকেশনটির জন্য এটি সহজ করে দিচ্ছেন, তবে আপনার নমনীয়তা কম রয়েছে।
মিগুয়েল

ধন্যবাদ!! এটা খুব সহায়ক। আমি আপাত অপ্রয়োজনীয়তা দেখে বিভ্রান্ত হয়ে পড়েছিলাম তবে দুটি বিকল্পের মধ্যে আমি বাণিজ্য বন্ধ দেখছি।
আরালার

এবং প্রকৃতপক্ষে, আমি এটি কখনও চেষ্টা করে দেখিনি, তবে সম্ভবত এটি সম্ভব যে আপনি ইউআরএল উপসর্গগুলি ব্লুপ্রিন্ট এবং অ্যাপ্লিকেশন উভয়ই, অ্যাপ্লিকেশনটির উপসর্গের মুষ্টির সাথে, পরে নীল প্রিন্টের সাথে সংযুক্ত করতে পারেন।
মিগুয়েল

5
মনে রাখবেন যে ব্লুপ্রিন্ট.রোউটে সজ্জিত ফাংশনগুলির পরে ব্লুপ্রিন্টটি নিবন্ধকরণ করা প্রয়োজন ।
কুইন্ট

53

আপনার লক্ষ্য করা উচিত যে APPLICATION_ROOTএই উদ্দেশ্যে নয়।

আপনাকে যা করতে হবে তা হ'ল নিম্নলিখিত পরিবর্তনগুলি করতে মিডলওয়্যারটি লিখতে হবে:

  1. PATH_INFOউপসর্গযুক্ত ইউআরএল পরিচালনা করতে পরিবর্তন করুন ।
  2. SCRIPT_NAMEপ্রিফিক্সড ইউআরএল তৈরি করতে পরিবর্তন করুন ।

এটার মত:

class PrefixMiddleware(object):

    def __init__(self, app, prefix=''):
        self.app = app
        self.prefix = prefix

    def __call__(self, environ, start_response):

        if environ['PATH_INFO'].startswith(self.prefix):
            environ['PATH_INFO'] = environ['PATH_INFO'][len(self.prefix):]
            environ['SCRIPT_NAME'] = self.prefix
            return self.app(environ, start_response)
        else:
            start_response('404', [('Content-Type', 'text/plain')])
            return ["This url does not belong to the app.".encode()]

মিডওয়্যারের সাথে আপনার অ্যাপ্লিকেশনটি মোড়ানো করুন:

from flask import Flask, url_for

app = Flask(__name__)
app.debug = True
app.wsgi_app = PrefixMiddleware(app.wsgi_app, prefix='/foo')


@app.route('/bar')
def bar():
    return "The URL for this page is {}".format(url_for('bar'))


if __name__ == '__main__':
    app.run('0.0.0.0', 9010)

দেখুন http://localhost:9010/foo/bar,

আপনি সঠিক ফলাফল পাবেন: The URL for this page is /foo/bar

আপনার যদি প্রয়োজন হয় তবে কুকি ডোমেন সেট করতে ভুলবেন না।

এই সমাধানটি ল্যারিভ্যাক্টের গিস্ট দ্বারা দেওয়া হয় । APPLICATION_ROOTযদিও এটা হতে মনে হচ্ছে, এই কাজের জন্য নয়। এটা সত্যিই বিভ্রান্তিকর।


4
এই উত্তর যুক্ত করার জন্য ধন্যবাদ। এখানে পোস্ট করা অন্যান্য সমাধানগুলির চেষ্টা করে দেখুন, তবে এটিই কেবল আমার জন্য কাজ করেছিল। A +++ আমি আইফিসে wfastcgi.py ব্যবহার করে মোতায়েন করছি
1:12

" APPLICATION_ROOTএই কাজের জন্য নয়" - এখানেই আমি ভুল করছি। আমি Blueprintএর url_prefixপ্যারামিটারটি চাই এবং APPLICATION_ROOTডিফল্টরূপে একত্রিত হয়েছি, যাতে APPLICATION_ROOTপুরো অ্যাপ্লিকেশনটির জন্য আমার স্কোপ url থাকতে পারে এবং কেবলমাত্র স্বতন্ত্র ব্লুপ্রিন্টের জন্য url_prefixস্কোপ url থাকতে পারে APPLICATION_ROOT। দীর্ঘশ্বাস
Monkpit

আমি কী ব্যবহার করে চেষ্টা করে যাচ্ছিলাম তার একটি উদাহরণের জন্য এই सारটি দেখুন APPLICATION_ROOT
Monkpit

4
আপনি যদি বন্দুকবাজ ব্যবহার করছেন, SQLT_NAME ইতিমধ্যে সমর্থিত। এটিকে পরিবেশের পরিবর্তনশীল হিসাবে সেট করুন বা এটি একটি এইচডিপি
blurrcat

4
কোডটি আমার পক্ষে কার্যকর হয়নি। কিছু গবেষণার পরে, আমি __call__পদ্ধতিটিতে response = Response('That url is not correct for this application', status=404) return response(environ, start_response)from werkzeug.wrappers import BaseResponse as Response
লুই বেকার

10

এটি ফ্লাস্ক / ওয়ার্কজেগ জবাবের চেয়ে পাইথন উত্তর বেশি; তবে এটি সহজ এবং কাজ করে।

যদি আমার মতো, আপনিও চান যে আপনার অ্যাপ্লিকেশন সেটিংস (কোনও .iniফাইল থেকে লোড করা ) আপনার ফ্লাস্ক অ্যাপ্লিকেশনটির উপসর্গ থাকতে পারে (সুতরাং, স্থাপনার সময় মান সেট না করে, তবে রানটাইম চলাকালীন), আপনি নিম্নলিখিতগুলির জন্য নির্বাচন করতে পারেন:

def prefix_route(route_function, prefix='', mask='{0}{1}'):
  '''
    Defines a new route function with a prefix.
    The mask argument is a `format string` formatted with, in that order:
      prefix, route
  '''
  def newroute(route, *args, **kwargs):
    '''New function to prefix the route'''
    return route_function(mask.format(prefix, route), *args, **kwargs)
  return newroute

তর্কসাপেক্ষ, এই কিছুটা hackish এবং আসলে বোতল রুট ফাংশন যা উপর নির্ভর প্রয়োজন একটি routeপ্রথম অবস্থানগত আর্গুমেন্ট হিসাবে।

আপনি এটি এর মতো ব্যবহার করতে পারেন:

app = Flask(__name__)
app.route = prefix_route(app.route, '/your_prefix')

বিশেষ দ্রষ্টব্য: এটা কোন মূল্য যে এটি একটি পরিবর্তনশীল (এটা সেটিং উদাহরণস্বরুপ prefix মধ্যে ব্যবহার করা সম্ভব হয় /<prefix>), এবং তারপর ফাংশন আপনি আপনার সঙ্গে সাজাইয়া রাখা এই উপসর্গ প্রক্রিয়া @app.route(...)। যদি আপনি এটি prefixকরেন তবে আপনার সাজসজ্জা ফাংশনগুলিতে অবশ্যই স্পষ্টভাবে প্যারামিটারটি ঘোষণা করতে হবে । এছাড়াও, আপনি কিছু নিয়মের বিপরীতে জমা দেওয়া উপসর্গটি চেক করতে এবং চেকটি ব্যর্থ হলে 404 ফেরত পাঠাতে পারেন। 404 টি কাস্টম পুনরায় বাস্তবায়ন এড়াতে, দয়া করে from werkzeug.exceptions import NotFoundএবং তারপরে raise NotFound()যদি চেক ব্যর্থ হয়।


এটি ব্যবহারের চেয়ে সহজ এবং আরও দক্ষ Blueprint। ভাগ করে নেওয়ার জন্য ধন্যবাদ!
এইচকে ছেলে

5

সুতরাং, আমি বিশ্বাস করি যে এর একটি বৈধ উত্তর হ'ল: ডেভলপমেন্ট সমাপ্ত হওয়ার পরে ব্যবহার করা প্রকৃত সার্ভার অ্যাপ্লিকেশনটিতে উপসর্গটি কনফিগার করা উচিত। অ্যাপাচি, এনগিনেক্স ইত্যাদি

তবে, আপনি যদি ডিবাগ-এ ফ্ল্যাশ অ্যাপ চালাওয়ার সময় বিকাশের সময় এটি কাজ করতে চান তবে এই সূচনাটি একবার দেখুন ।

ফ্লাস্কের DispatcherMiddlewareউদ্ধার!

আমি এখানে উত্তরসূরির জন্য কোডটি অনুলিপি করব:

"Serve a Flask app on a sub-url during localhost development."

from flask import Flask


APPLICATION_ROOT = '/spam'


app = Flask(__name__)
app.config.from_object(__name__)  # I think this adds APPLICATION_ROOT
                                  # to the config - I'm not exactly sure how!
# alternatively:
# app.config['APPLICATION_ROOT'] = APPLICATION_ROOT


@app.route('/')
def index():
    return 'Hello, world!'


if __name__ == '__main__':
    # Relevant documents:
    # http://werkzeug.pocoo.org/docs/middlewares/
    # http://flask.pocoo.org/docs/patterns/appdispatch/
    from werkzeug.serving import run_simple
    from werkzeug.wsgi import DispatcherMiddleware
    app.config['DEBUG'] = True
    # Load a dummy app at the root URL to give 404 errors.
    # Serve app at APPLICATION_ROOT for localhost development.
    application = DispatcherMiddleware(Flask('dummy_app'), {
        app.config['APPLICATION_ROOT']: app,
    })
    run_simple('localhost', 5000, application, use_reloader=True)

এখন, উপরের কোডটি স্ট্যান্ড্যালোন ফ্লাস্ক অ্যাপ হিসাবে চালানোর সময় http://localhost:5000/spam/প্রদর্শিত হবে Hello, world!

অন্য উত্তরের মন্তব্যে আমি প্রকাশ করেছি যে আমি এরকম কিছু করতে চাই:

from flask import Flask, Blueprint

# Let's pretend module_blueprint defines a route, '/record/<id>/'
from some_submodule.flask import module_blueprint

app = Flask(__name__)
app.config['APPLICATION_ROOT'] = '/api'
app.register_blueprint(module_blueprint, url_prefix='/some_submodule')
app.run()

# I now would like to be able to get to my route via this url:
# http://host:8080/api/some_submodule/record/1/

DispatcherMiddlewareআমার স্বীকৃত উদাহরণটিতে প্রয়োগ করা:

from flask import Flask, Blueprint
from flask.serving import run_simple
from flask.wsgi import DispatcherMiddleware

# Let's pretend module_blueprint defines a route, '/record/<id>/'
from some_submodule.flask import module_blueprint

app = Flask(__name__)
app.config['APPLICATION_ROOT'] = '/api'
app.register_blueprint(module_blueprint, url_prefix='/some_submodule')
application = DispatcherMiddleware(Flask('dummy_app'), {
    app.config['APPLICATION_ROOT']: app
})
run_simple('localhost', 5000, application, use_reloader=True)

# Now, this url works!
# http://host:8080/api/some_submodule/record/1/

"সুতরাং, আমি বিশ্বাস করি যে এর একটি বৈধ উত্তর হ'ল: ডেভলপমেন্ট সমাপ্ত হওয়ার পরে ব্যবহার করা প্রকৃত সার্ভার অ্যাপ্লিকেশনটিতে উপসর্গটি কনফিগার করা উচিত Ap অ্যাপাচি, এনগিনেক্স ইত্যাদি" " সমস্যাটি পুনঃনির্দেশে রয়েছে; যদি আপনার উপসর্গ থাকে এবং এটি ফ্লাস্কে সেট আপ না করে থাকেন, তবে যখন এটি / আপনারপ্রেফিক্স / পাথ / টু / ইউআরএল পরিবর্তে পুনঃনির্দেশ করে তখন এটি কেবল / পথে / থেকে / ইউআরএল যায়। এনগিনেক্স বা অ্যাপাচিতে উপস্থাপনের কী আছে সেটআপ করার কোনও উপায় আছে?
জর্ডান রিটার

আমি সম্ভবত এটি করার উপায়টি হ'ল পুতুল বা শেফের মতো একটি কনফিগারেশন ম্যানেজমেন্ট সরঞ্জাম ব্যবহার করা এবং সেখানে উপসর্গটি সেট করা এবং তারপরে সরঞ্জামটি কনফিগার ফাইলগুলিতে পরিবর্তনের প্রচার করতে হবে যেখানে এটি যেতে হবে। আমি এমন ভানও করতে যাচ্ছি না যে আমি জানি আপাচি বা এনজিএনএক্সের জন্য আমি কী বলছি। যেহেতু এই প্রশ্ন / উত্তরটি অজগরটির জন্য নির্দিষ্ট ছিল, তাই আমি আপনাকে আপনার পরিস্থিতি একটি পৃথক প্রশ্ন হিসাবে পোস্ট করতে উত্সাহিত করব। আপনি যদি এটি করেন তবে বিনা দ্বিধায় প্রশ্নের সাথে লিঙ্ক করুন!
Monkpit

2

আরেকটি সম্পূর্ণ ভিন্ন পথ সঙ্গে হয় mountpoints মধ্যে uwsgi

একই প্রক্রিয়াতে একাধিক অ্যাপ্লিকেশন হোস্টিং সম্পর্কে ডক থেকে ( পারমালিঙ্ক )।

আপনার uwsgi.iniযোগ করুন

[uwsgi]
mount = /foo=main.py
manage-script-name = true

# also stuff which is not relevant for this, but included for completeness sake:    
module = main
callable = app
socket = /tmp/uwsgi.sock

আপনি যদি নিজের ফাইলটি কল না করেন তবে আপনার main.pyদুটি mountএবং এর দুটি পরিবর্তন করতে হবেmodule

আপনার main.pyদেখতে এই মত হতে পারে:

from flask import Flask, url_for
app = Flask(__name__)
@app.route('/bar')
def bar():
  return "The URL for this page is {}".format(url_for('bar'))
# end def

এবং একটি nginx কনফিগার (সম্পূর্ণতার জন্য আবার):

server {
  listen 80;
  server_name example.com

  location /foo {
    include uwsgi_params;
    uwsgi_pass unix:///temp/uwsgi.sock;
  }
}

এখন কলিং ফ্লাস্কের দ্বারা প্রত্যাবর্তিত হিসাবে example.com/foo/barপ্রদর্শিত হবে , যেমন এটি স্বয়ংক্রিয়ভাবে গৃহীত হয়। আপনার লিঙ্কগুলি উপসর্গ সমস্যা ছাড়াই কাজ করবে।/foo/barurl_for('bar')


2
from flask import Flask

app = Flask(__name__)

app.register_blueprint(bp, url_prefix='/abc/123')

if __name__ == "__main__":
    app.run(debug='True', port=4444)


bp = Blueprint('burritos', __name__,
                        template_folder='templates')

@bp.route('/')
def test():
    return "success"

4
একটি ব্যাখ্যা যোগ বিবেচনা করুন।
জেপিপি

4
দুটি ভাল ব্যাখ্যা আমি পেয়েছি এক্সপ্লোরারফ্লাস্ক এবং সরকারী দস্তাবেজে
ইউরিপলোক

1

আমার অনুরূপ তথাকথিত "প্রসঙ্গ-মূল" প্রয়োজন। আমি WSGIScriptAlias ​​ব্যবহার করে /etc/httpd/conf.d/ এর অধীনে কনফিড ফাইলটিতে এটি করেছি:

myapp.conf:

<VirtualHost *:80>
    WSGIScriptAlias /myapp /home/<myid>/myapp/wsgi.py

    <Directory /home/<myid>/myapp>
        Order deny,allow
        Allow from all
    </Directory>

</VirtualHost>

সুতরাং এখন আমি আমার অ্যাপ্লিকেশনটি যেমন: HTTP: // লোকালহোস্ট: 5000 / মাইএপ অ্যাক্সেস করতে পারি

গাইডটি দেখুন - http://modwsgi.readthedocs.io/en/deلاف / user - guides / quick - configration - guide.html


1

আমার সমাধান যেখানে ফ্লাস্ক এবং পিএইচপি অ্যাপ্লিকেশনগুলি এনজিনেক্স এবং পিএইচপি 5.6 সহাবস্থান করে

রুট এ KEEP ফ্লাস্ক এবং উপ ডিরেক্টরিতে পিএইচপি করুন

sudo vi /etc/php/5.6/fpm/php.ini

1 লাইন যুক্ত করুন

cgi.fix_pathinfo=0
sudo vi /etc/php/5.6/fpm/pool.d/www.conf
listen = /run/php/php5.6-fpm.sock

uwsgi

sudo vi /etc/nginx/sites-available/default

পিএইচপি-র জন্য প্রয়োজনীয় অবস্থানগুলি ব্যবহার করুন এবং FLASK কে মূলের মধ্যে থাকতে দিন

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    # SSL configuration
    #
    # listen 443 ssl default_server;
    # listen [::]:443 ssl default_server;
    #
    # Note: You should disable gzip for SSL traffic.
    # See: https://bugs.debian.org/773332
    #
    # Read up on ssl_ciphers to ensure a secure configuration.
    # See: https://bugs.debian.org/765782
    #
    # Self signed certs generated by the ssl-cert package
    # Don't use them in a production server!
    #
    # include snippets/snakeoil.conf;

    root /var/www/html;

    # Add index.php to the list if you are using PHP
    index index.html index.htm index.php index.nginx-debian.html;

    server_name _;

    # Serve a static file (ex. favico) outside static dir.
    location = /favico.ico  {    
        root /var/www/html/favico.ico;    
    }

    # Proxying connections to application servers
    location / {
        include            uwsgi_params;
        uwsgi_pass         127.0.0.1:5000;
    }

    location /pcdp {
        location ~* \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass unix:/var/run/php/php5.6-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
    }

    location /phpmyadmin {
        location ~* \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass unix:/var/run/php/php5.6-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
    }

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #   include snippets/fastcgi-php.conf;
    #
    #   # With php7.0-cgi alone:
    #   fastcgi_pass 127.0.0.1:9000;
    #   # With php7.0-fpm:
    #   fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #   deny all;
    #}
}

সাবধানতার সাথে পড়ুন https://www.digitalocean.com/commune/tutorials/ বোঝার-nginx-server-and-location- block-selection- algorithms

আমাদের অবস্থানের মিলটি (কোনওটি নয়) বুঝতে হবে: যদি কোনও সংশোধক উপস্থিত না থাকে তবে অবস্থানটি উপসর্গের ম্যাচ হিসাবে ব্যাখ্যা করা হয়। এর অর্থ হল যে কোনও স্থান নির্ধারণের জন্য ইউআরআই অনুরোধের শুরুতে দেওয়া অবস্থানটি মিলবে। =: যদি একটি সমান চিহ্ন ব্যবহৃত হয় তবে অনুরোধ ইউআরআই প্রদত্ত অবস্থানের সাথে সঠিকভাবে মেলে যদি এই ব্লকটি একটি ম্যাচ হিসাবে বিবেচিত হবে। ।: যদি টিল্ড মডিফায়ার উপস্থিত থাকে তবে এই অবস্থানটি কেস-সংবেদনশীল নিয়মিত অভিব্যক্তি ম্যাচ হিসাবে ব্যাখ্যা করা হবে। ~ *: যদি একটি টিলড এবং অ্যাসিটার্কিক সংশোধক ব্যবহার করা হয় তবে লোকেশন ব্লকটি কেস-সংবেদনশীল নিয়মিত অভিব্যক্তি ম্যাচ হিসাবে ব্যাখ্যা করা হবে। ~ ~: যদি একটি ক্যারেট এবং টিলড মডিফায়ার উপস্থিত থাকে এবং যদি এই ব্লকটি সেরা অ-নিয়মিত এক্সপ্রেশন ম্যাচ হিসাবে নির্বাচিত হয়, তবে নিয়মিত এক্সপ্রেশন মিলবে না।

অর্গান গুরুত্বপূর্ণ, এনগিনেক্সের "অবস্থান" বর্ণনা থেকে:

প্রদত্ত অনুরোধের সাথে মিলে যাওয়া অবস্থানটি সন্ধান করতে, এনজিনেক্স প্রথমে উপসর্গের স্ট্রিংগুলি (উপসর্গের অবস্থানগুলি) ব্যবহার করে সংজ্ঞায়িত অবস্থানগুলি পরীক্ষা করে। তাদের মধ্যে, দীর্ঘতম মিলের উপসর্গের সাথে অবস্থানটি নির্বাচন করা এবং মনে রাখা হয়। তারপরে কনফিগারেশন ফাইলে তাদের উপস্থিতির ক্রম অনুসারে নিয়মিত প্রকাশগুলি পরীক্ষা করা হয়। নিয়মিত এক্সপ্রেশনগুলির অনুসন্ধান প্রথম ম্যাচে শেষ হয় এবং এটির সাথে সম্পর্কিত কনফিগারেশন ব্যবহার করা হয়। যদি নিয়মিত অভিব্যক্তির সাথে কোনও মিল না পাওয়া যায় তবে পূর্বে মনে রাখা উপসর্গের অবস্থানটি কনফিগারেশন ব্যবহার করা হয়।

এর অর্থ:

First =. ("longest matching prefix" match)
Then implicit ones. ("longest matching prefix" match)
Then regex. (first match)

1

এখনও এটি নিয়ে লড়াই করা লোকদের জন্য, প্রথম উদাহরণটি কাজ করে তবে পুরো উদাহরণটি এখানে আপনার যদি নিয়ন্ত্রণে নেই এমন একটি ফ্লাস্ক অ্যাপ থাকে তবে:

from os import getenv
from werkzeug.middleware.dispatcher import DispatcherMiddleware
from werkzeug.serving import run_simple
from custom_app import app

application = DispatcherMiddleware(
    app, {getenv("REBROW_BASEURL", "/rebrow"): app}
)

if __name__ == "__main__":
    run_simple(
        "0.0.0.0",
        int(getenv("REBROW_PORT", "5001")),
        application,
        use_debugger=False,
        threaded=True,
    )
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.