SORU
17 Kasım 2013, Pazar


Şişeyi amacı'bağlama yığınları ler nedir?

Nasıl çalıştığını ya da bir şekilde tasarlanmıştır neden tam olarak anlamadan bir süre istek/uygulama bağlamında kullanıyorum. Amacı "" ne zaman istek veya uygulama kapsamında gelir? yığın ne Bu iki ayrı yığınları, ya da her iki parçası bir yığın? İstek üzerine itti içerik yığını, yoksa kendisi yığını mı? Birbirlerinin üzerine/pop çok içeriğin bas edebilir miyim? Eğer öyleyse, neden bunu yapmak isteyeyim?

Sorular için özür dilerim, ama hala İstek İçeriği ve Uygulama Kapsamında belgelerini okuduktan sonra kafam karıştı.

CEVAP
18 Kasım 2013, PAZARTESİ


Birden Çok Uygulama

Uygulama kapsamında (ve amacı) aslında o Şişeyi birden çok uygulama olabilir sen fark edene kadar kafa karıştırıcı. Tek WSGI bir Python yorumlayıcısı Şişeyi birden fazla uygulama çalıştırmak istediğiniz durumu hayal edin. Burada Planları bahsetmiyoruz, tamamen farklı Şişe uygulamaları konuşuyoruz.

Bu Flask documentation section on "Application Dispatching" örneğe benzer ayarlayabilirsiniz:

from werkzeug.wsgi import DispatcherMiddleware
from frontend_app import application as frontend
from backend_app import application as backend

application = DispatcherMiddleware(frontend, {
    '/backend':     backend
})

Tamamen farklı iki Şişe uygulamalar oluşturulan olduğunu unutmayın "" ve "". arka uç arayüzü Diğer bir deyişle, Flask(...) uygulama oluşturucu iki kez, silindir bir uygulama iki örneğini oluşturmaya çağrıldı.

Kapsamları

Matara ile çalışırken, sık sık çeşitli işlevleri erişim için küresel değişkenleri kullanarak sonuna kadar. Örneğin, muhtemelen okuyan bir kod var

from flask import request

Sonra, bir görünüm sırasında, request geçerli istek bilgilere erişmek için kullanabilirsiniz. Belli ki, request normal global bir değişken değil; aslında, context local bir değerdir. Diğer bir deyişle, diyor perde arkasında bazı büyü var request.path, path get okuduğumda "GEÇERLİ istek request nesne özniteliği." İki farklı istekleri request.path için farklı sonuçlar doğuracaktır.

Eğer Şişeyi birden çok iş parçacığı ile çalıştırırsanız bile aslında, Şişeyi isteği nesneleri izole tutmak için yeterince akıllı. Bunu yaparken, iki iş parçacığı, her biri farklı bir talep işleme, aynı anda request.path arama ve kendi istekleri için doğru bilgileri elde etmek için mümkün olur.

Hep Birlikte koymak

Yani biz zaten görülen o Şişeyi kolunun birden fazla uygulamada aynı yorumlayıcı, ve de bu yüzden o Şişeyi kullanın "kapsamında yerel" bütünsel olmalı mekanizması belirlemek ne "geçerli"istekrequest.path gibi şeyleri yapmak için ().

Beraber bu fikirleri koyarak, aynı zamanda Şişe belirlemek için bir yol olması gerekir bu anlamda yapmak gerekir "geçerli" uygulama!

Ayrıca, aşağıdakine benzer bir kod var:

from flask import url_for

request bizim gibi, url_for Bu işlev o anki ortama bağlı olarak değişir bu mantık vardır. Bu durumda, ancak, açık mantığı "" app. geçerli olarak kabul edilir büyük ölçüde bağımlı olduğunu görmek Bu ön/arka uç örnek gösterilen üstünde, hem de "ön" ve "arka uç" uygulamalar olabilir "/login" rota ve url_for('/login') dönmeyin farklı bir şey bağlı ise görünümdür kullanma isteği için ön ya da arka uç uygulaması.

Sorularınızı cevap...

Amacı nedir "isteği gelince" ya da yığın uygulama kapsamında?

İstek dokümanlar İçerik:

İstek içeriği yığını olarak dahili olarak korunur, çünkü itme ve birden çok kez pop. Bu çok kullanışlı ve uygulamaktır iç yönlendirmeler gibi şeyler.

Genellikle bu 0 veya 1 öğe "geçerli" bir isteğiniz veya "geçerli", daha da olanaklıdır uygulamaları. yığını olsa başka bir deyişle,

Örnek verilen isteğiniz bir sonuçlar döndürmek zorunda "iç yönlendirme". Diyelim ki bir kullanıcı istekleri, ama sana geri dönmek için Kullanıcı B. çoğu durumda, sorun yönlendirme için kullanıcı ve kullanıcı için kaynak B, anlamını kullanıcı çalıştırılacak bir ikinci talep getirme B. biraz farklı Bir şekilde kullanma bunun için bir dahili yönlendirme anlamına gelir iken işleme, Flask hale getirecek yeni bir talebe kendisi için kaynak B, ve kullanım sonuçları bu ikinci istek olarak sonuçlar, kullanıcının özgün isteği.

Bu iki ayrı yığınları, ya da her iki parçası bir yığın?

two separate stacks. Ancak, bu uygulama bir detay. Daha da önemlisi bir yığın var o kadar çok değil, ama herhangi bir zamanda alabilirsiniz aslında "geçerli" uygulaması ya da istek (top of the stack).

İstek üzerine itti içerik yığını, yoksa kendisi yığını mı?

"İstek" bir kalem "istek yığın". bağlam bağlam Aynı şekilde "app içerik" ve "app içerik yığını".

Birbirlerinin üzerine/pop çok içeriğin bas edebilir miyim? Eğer öyleyse, neden bunu yapmak isteyeyim?

Şişeyi bir uygulamada, genellikle böyle bir şey yapmaz. Size bir örnek dahili yönlendirme için (yukarıda). Hatta bu durumda, ancak, muhtemelen Şişeyi yeni bir isteği işlemek zorunda sona ereceğini ve Şişeyi iterek/size haşhaş mı diye.

Ancak, kendini yığın işlemek isterdim bazı durumlar vardır.

Çalışan bir kod isteği dışında

İnsanların tipik bir sorun, SQL veritabanı ve model tanımı aşağıda gösterildiği gibi bir şey... kod kullanarak ayarlamak için Matara-SQLAlchemy uzantısını kullanıyorlar

app = Flask(__name__)
db = SQLAlchemy() # Initialize the Flask-SQLAlchemy extension object
db.init_app(app)

Sonra kabuğundan çalışması gereken bir komut dosyası app db değerleri kullanıyorlar. Bir "script..." dedi . setup_tables.py örneğin,

from myapp import app, db

# Set up models
db.create_all()

Bu durumda, Matara-SQLAlchemy uzantısı app uygulama haberi var, ama create_all() sırasında bir hata uygulama bir bağlam olmaması için şikayet atmak olacak. Bu hata, haklı; Flask ne create_all yöntemi çalışırken ile ilgili olması gerektiğini asla söylemedi.

Görünümleri benzer işlevler çalıştırdığınızda with app.app_context() bu ara ihtiyacın yok neden merak ediyor olabilirsiniz. Nedeni Şişesi gerçek web istekleri işlerken zaten uygulama kapsamında yönetim kolları. Sorun gerçekten sadece bu görünüm işlevleri (veya benzeri geri), modeller üzerinde olan bir komut dosyası kullanırken gibi dışarı çıkıyor.

Çözünürlüğü yaparak yapılabilecek uygulama kapsamında kendinizi itmek için

from myapp import app, db

# Set up models
with app.app_context():
    db.create_all()

Bu yeni uygulama bir bağlam (app birden fazla uygulama olabilir unutmayın, bu uygulamayı kullanarak) itecektir.

Test

Değiştirmek için istediğiniz bir dosyayı test etmek için yığın. Bir isteği işleyen bir birim test oluşturabilirsiniz ve sonuçları kontrol edin:

import unittest
from flask import request

class MyTest(unittest.TestCase):
    def test_thing(self):
        with app.test_request_context('/?next=http://example.com/') as ctx:
            # You can now view attributes on request context stack by using `request`.

        # Now the request context stack is empty

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • katherine gomez

    katherine go

    1 Aralık 2011
  • ThisWeekYT

    ThisWeekYT

    14 Mart 2013
  • Troy Hunt

    Troy Hunt

    29 EYLÜL 2011