Jawabannya tergantung bagaimana Anda melayani aplikasi ini.
Sub-mount di dalam wadah WSGI lain
Dengan asumsi bahwa Anda akan menjalankan aplikasi ini di dalam wadah WSGI (mod_wsgi, uwsgi, gunicorn, dll); Anda harus benar-benar memasang, pada awalan itu aplikasi sebagai sub-bagian dari wadah WSGI itu (apa pun yang berbicara WSGI akan dilakukan) dan untuk mengatur APPLICATION_ROOT
nilai konfigurasi Anda ke awalan Anda:
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/"
Menyetel nilai APPLICATION_ROOT
konfigurasi cukup membatasi cookie sesi Flask ke awalan URL itu. Segala sesuatu yang lain akan ditangani secara otomatis untuk Anda oleh kemampuan penanganan WSGI Flask dan Werkzeug yang sangat baik.
Contoh pemasangan aplikasi Anda dengan benar
Jika Anda tidak yakin apa arti paragraf pertama, lihat aplikasi contoh ini dengan Flask terpasang di dalamnya:
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)
Permintaan proxy ke aplikasi
Sebaliknya, jika Anda akan menjalankan aplikasi Flask Anda di root dari wadah WSGI dan mem-proxy permintaan ke sana (misalnya, jika itu menjadi FastCGI, atau jika nginx proxy_pass
meminta sub-endpoint ke server uwsgi
/ stand-alone gevent
Anda, maka Anda dapat:
- Gunakan Cetak Biru, seperti yang ditunjukkan Miguel dalam jawabannya .
- atau gunakan
DispatcherMiddleware
dari werkzeug
(atau PrefixMiddleware
dari jawaban su27 ) untuk mensub-mount aplikasi Anda di server WSGI mandiri yang Anda gunakan. (Lihat Contoh memasang aplikasi Anda di atas dengan benar untuk kode yang akan digunakan).
flask.Flask#create_url_adapter
danwerkzeug.routing.Map#bind_to_environ
kelihatannya seperti itu harus bekerja - bagaimana anda menjalankan kode? (Aplikasi sebenarnya perlu dipasang di sub-jalur di lingkungan WSGI untukurl_for
mengembalikan nilai yang diharapkan.)DispatcherMiddleware
pendekatan, saat menjalankan flask dengan sendirinya. Sepertinya tidak bisa mendapatkan ini berfungsi saat berlari di belakang Gunicorn.uwsgi -s /tmp/yourapplication.sock --manage-script-name --mount /yourapplication=myapp:app
. detail lihat (dokumen uwsgi) [ flask.pocoo.org/docs/1.0/deploying/uwsgi/]Anda dapat meletakkan rute Anda di cetak biru:
Kemudian Anda mendaftarkan cetak biru tersebut dengan aplikasi menggunakan awalan:
sumber
app.register_blueprint
dan antara mendaftarkannya saat Anda membuat instance objek Blueprint di atas, dengan meneruskanurl_prefix='/abc/123
? Terima kasih!register_blueprint
panggilan memberi aplikasi kebebasan untuk "memasang" cetak biru di mana pun yang diinginkannya, atau bahkan memasang cetak biru yang sama beberapa kali pada URL yang berbeda. Jika Anda meletakkan awalan di cetak biru itu sendiri, Anda membuatnya lebih mudah untuk aplikasi, tetapi Anda memiliki fleksibilitas yang kurang.Anda harus memperhatikan bahwa
APPLICATION_ROOT
BUKAN untuk tujuan ini.Yang harus Anda lakukan adalah menulis middleware untuk membuat perubahan berikut:
PATH_INFO
untuk menangani url yang diawali.SCRIPT_NAME
untuk menghasilkan url awalan.Seperti ini:
Bungkus aplikasi Anda dengan middleware, seperti ini:
Kunjungi
http://localhost:9010/foo/bar
,Anda akan mendapatkan hasil yang benar:
The URL for this page is /foo/bar
Dan jangan lupa untuk menyetel domain cookie jika Anda perlu.
Solusi ini diberikan oleh inti Larivact . Ini
APPLICATION_ROOT
bukan untuk pekerjaan ini, meskipun kelihatannya seperti itu. Benar-benar membingungkan.sumber
APPLICATION_ROOT
bukan untuk pekerjaan ini" - di sinilah kesalahan saya. Saya berharapBlueprint
'surl_prefix
parameter danAPPLICATION_ROOT
digabungkan secara default, sehingga saya bisa memilikiAPPLICATION_ROOT
url lingkup untuk seluruh aplikasi, danurl_prefix
url ruang lingkup dalamAPPLICATION_ROOT
hanya untuk cetak biru individu. SighAPPLICATION_ROOT
.__call__
metode:response = Response('That url is not correct for this application', status=404) return response(environ, start_response)
menggunakanfrom werkzeug.wrappers import BaseResponse as Response
Ini lebih merupakan jawaban python daripada jawaban Flask / werkzeug; tapi sederhana dan berhasil.
Jika, seperti saya, Anda ingin pengaturan aplikasi Anda (dimuat dari
.ini
file) juga berisi awalan aplikasi Flask Anda (dengan demikian, tidak memiliki nilai yang ditetapkan selama penerapan, tetapi selama waktu proses), Anda dapat memilih hal berikut:Bisa dibilang, ini agak hackish dan bergantung pada fakta bahwa fungsi rute Flask membutuhkan sebuah
route
argumen posisi pertama.Anda bisa menggunakannya seperti ini:
NB: Tidak ada artinya bahwa Anda dapat menggunakan variabel di awalan (misalnya dengan menyetelnya ke
/<prefix>
), lalu memproses awalan ini di fungsi yang Anda hiasi dengan file@app.route(...)
. Jika Anda melakukannya, Anda jelas harus mendeklarasikanprefix
parameter dalam fungsi yang didekorasi. Selain itu, Anda mungkin ingin memeriksa prefiks yang dikirimkan terhadap beberapa aturan, dan mengembalikan 404 jika pemeriksaan gagal. Untuk menghindari implementasi ulang kustom 404, silakanfrom werkzeug.exceptions import NotFound
dan kemudianraise NotFound()
jika pemeriksaan gagal.sumber
Blueprint
. Terima kasih telah berbagi!Jadi, saya percaya bahwa jawaban yang valid untuk ini adalah: awalan harus dikonfigurasi dalam aplikasi server sebenarnya yang Anda gunakan saat pengembangan selesai. Apache, nginx, dll.
Namun, jika Anda ingin ini bekerja selama pengembangan sambil menjalankan aplikasi Flask dalam debug, lihat inti berikut ini. .
Flask
DispatcherMiddleware
untuk menyelamatkan!Saya akan menyalin kode di sini untuk anak cucu:
Sekarang, saat menjalankan kode di atas sebagai aplikasi Flask yang berdiri sendiri,
http://localhost:5000/spam/
akan munculHello, world!
.Dalam komentar di jawaban lain, saya menyatakan bahwa saya ingin melakukan sesuatu seperti ini:
Menerapkan
DispatcherMiddleware
contoh buatan saya:sumber
Cara lain yang sama sekali berbeda adalah dengan mountpoints di
uwsgi
.Dari dokumen tentang Hosting beberapa aplikasi dalam proses yang sama ( tautan permanen ).
Dalam
uwsgi.ini
Anda menambahkanJika Anda tidak memanggil file
main.py
Anda, Anda perlu mengubahmount
danmodule
Anda
main.py
bisa terlihat seperti ini:Dan konfigurasi nginx (sekali lagi untuk kelengkapan):
Sekarang pemanggilan
example.com/foo/bar
akan ditampilkan/foo/bar
sebagai dikembalikan oleh flaskurl_for('bar')
, karena ia beradaptasi secara otomatis. Dengan begitu, tautan Anda akan berfungsi tanpa masalah awalan.sumber
sumber
Saya membutuhkan yang serupa yang disebut "akar konteks". Saya melakukannya di file conf di bawah /etc/httpd/conf.d/ menggunakan WSGIScriptAlias:
myapp.conf:
Jadi sekarang saya dapat mengakses aplikasi saya sebagai: http: // localhost: 5000 / myapp
Lihat panduan - http://modwsgi.readthedocs.io/en/develop/user-guides/quick-configuration-guide.html
sumber
Solusi saya di mana flask dan aplikasi PHP hidup berdampingan dengan nginx dan PHP5.6
KEEP Flask di root dan PHP di subdirektori
Tambahkan 1 baris
GUNAKAN LOKASI NESTED untuk PHP dan biarkan FLASK tetap di root
BACA dengan cermat https://www.digitalocean.com/community/tutorials/understanding-nginx-server-and-location-block-selection-algorithms
Kita perlu memahami pencocokan lokasi (tidak ada): Jika tidak ada pengubah, lokasi diartikan sebagai pencocokan awalan. Ini berarti lokasi yang diberikan akan dicocokkan dengan awal URI permintaan untuk menentukan kecocokan. =: Jika digunakan tanda sama dengan, blok ini akan dianggap cocok jika URI permintaan sama persis dengan lokasi yang diberikan. ~: Jika ada pengubah tilde, lokasi ini akan ditafsirkan sebagai pencocokan ekspresi reguler peka huruf besar kecil. ~ *: Jika pengubah tilde dan tanda bintang digunakan, blok lokasi akan ditafsirkan sebagai pencocokan ekspresi reguler peka huruf besar / kecil. ^ ~: Jika pengubah carat dan tilde ada, dan jika blok ini dipilih sebagai pencocokan ekspresi non-reguler terbaik, pencocokan ekspresi reguler tidak akan berlangsung.
Urutan itu penting, dari deskripsi "lokasi" nginx:
Untuk menemukan lokasi yang cocok dengan permintaan yang diberikan, nginx pertama-tama memeriksa lokasi yang ditentukan menggunakan string prefiks (lokasi prefiks). Di antara mereka, lokasi dengan awalan pencocokan terpanjang dipilih dan diingat. Kemudian ekspresi reguler diperiksa, dalam urutan kemunculannya di file konfigurasi. Pencarian ekspresi reguler berakhir pada kecocokan pertama, dan konfigurasi terkait digunakan. Jika tidak ditemukan kecocokan dengan ekspresi reguler, maka konfigurasi lokasi prefiks yang diingat sebelumnya akan digunakan.
Itu berarti:
sumber
Untuk orang-orang yang masih kesulitan dengan ini, contoh pertama memang berfungsi, tetapi contoh lengkapnya ada di sini jika Anda memiliki aplikasi Flask yang tidak Anda kendalikan:
sumber