Merge pull request #285 from r0fls/blueprint-domains

add vhosts to blueprints
This commit is contained in:
Eli Uriegas 2017-01-11 10:00:35 -06:00 committed by GitHub
commit a93ca9b8f1
3 changed files with 91 additions and 8 deletions

View File

@ -1,11 +1,15 @@
from sanic.response import text from sanic.response import text
from sanic import Sanic from sanic import Sanic
from sanic.blueprints import Blueprint
# Usage # Usage
# curl -H "Host: example.com" localhost:8000 # curl -H "Host: example.com" localhost:8000
# curl -H "Host: sub.example.com" localhost:8000 # curl -H "Host: sub.example.com" localhost:8000
# curl -H "Host: bp.example.com" localhost:8000/question
# curl -H "Host: bp.example.com" localhost:8000/answer
app = Sanic() app = Sanic()
bp = Blueprint("bp", host="bp.example.com")
@app.route('/', host="example.com") @app.route('/', host="example.com")
async def hello(request): async def hello(request):
@ -14,5 +18,15 @@ async def hello(request):
async def hello(request): async def hello(request):
return text("42") return text("42")
@bp.route("/question")
async def hello(request):
return text("What is the meaning of life?")
@bp.route("/answer")
async def hello(request):
return text("42")
app.register_blueprint(bp)
if __name__ == '__main__': if __name__ == '__main__':
app.run(host="0.0.0.0", port=8000) app.run(host="0.0.0.0", port=8000)

View File

@ -18,14 +18,17 @@ class BlueprintSetup:
#: blueprint. #: blueprint.
self.url_prefix = url_prefix self.url_prefix = url_prefix
def add_route(self, handler, uri, methods): def add_route(self, handler, uri, methods, host=None):
""" """
A helper method to register a handler to the application url routes. A helper method to register a handler to the application url routes.
""" """
if self.url_prefix: if self.url_prefix:
uri = self.url_prefix + uri uri = self.url_prefix + uri
self.app.route(uri=uri, methods=methods)(handler) if host is None:
host = self.blueprint.host
self.app.route(uri=uri, methods=methods, host=host)(handler)
def add_exception(self, handler, *args, **kwargs): def add_exception(self, handler, *args, **kwargs):
""" """
@ -53,7 +56,7 @@ class BlueprintSetup:
class Blueprint: class Blueprint:
def __init__(self, name, url_prefix=None): def __init__(self, name, url_prefix=None, host=None):
""" """
Creates a new blueprint Creates a new blueprint
:param name: Unique name of the blueprint :param name: Unique name of the blueprint
@ -63,6 +66,7 @@ class Blueprint:
self.url_prefix = url_prefix self.url_prefix = url_prefix
self.deferred_functions = [] self.deferred_functions = []
self.listeners = defaultdict(list) self.listeners = defaultdict(list)
self.host = host
def record(self, func): def record(self, func):
""" """
@ -83,18 +87,18 @@ class Blueprint:
for deferred in self.deferred_functions: for deferred in self.deferred_functions:
deferred(state) deferred(state)
def route(self, uri, methods=None): def route(self, uri, methods=None, host=None):
""" """
""" """
def decorator(handler): def decorator(handler):
self.record(lambda s: s.add_route(handler, uri, methods)) self.record(lambda s: s.add_route(handler, uri, methods, host))
return handler return handler
return decorator return decorator
def add_route(self, handler, uri, methods=None): def add_route(self, handler, uri, methods=None, host=None):
""" """
""" """
self.record(lambda s: s.add_route(handler, uri, methods)) self.record(lambda s: s.add_route(handler, uri, methods, host))
return handler return handler
def listener(self, event): def listener(self, event):

View File

@ -59,6 +59,71 @@ def test_several_bp_with_url_prefix():
request, response = sanic_endpoint_test(app, uri='/test2/') request, response = sanic_endpoint_test(app, uri='/test2/')
assert response.text == 'Hello2' assert response.text == 'Hello2'
def test_bp_with_host():
app = Sanic('test_bp_host')
bp = Blueprint('test_bp_host', url_prefix='/test1', host="example.com")
@bp.route('/')
def handler(request):
return text('Hello')
@bp.route('/', host="sub.example.com")
def handler(request):
return text('Hello subdomain!')
app.blueprint(bp)
headers = {"Host": "example.com"}
request, response = sanic_endpoint_test(app, uri='/test1/',
headers=headers)
assert response.text == 'Hello'
headers = {"Host": "sub.example.com"}
request, response = sanic_endpoint_test(app, uri='/test1/',
headers=headers)
assert response.text == 'Hello subdomain!'
def test_several_bp_with_host():
app = Sanic('test_text')
bp = Blueprint('test_text',
url_prefix='/test',
host="example.com")
bp2 = Blueprint('test_text2',
url_prefix='/test',
host="sub.example.com")
@bp.route('/')
def handler(request):
return text('Hello')
@bp2.route('/')
def handler2(request):
return text('Hello2')
@bp2.route('/other/')
def handler2(request):
return text('Hello3')
app.blueprint(bp)
app.blueprint(bp2)
assert bp.host == "example.com"
headers = {"Host": "example.com"}
request, response = sanic_endpoint_test(app, uri='/test/',
headers=headers)
assert response.text == 'Hello'
assert bp2.host == "sub.example.com"
headers = {"Host": "sub.example.com"}
request, response = sanic_endpoint_test(app, uri='/test/',
headers=headers)
assert response.text == 'Hello2'
request, response = sanic_endpoint_test(app, uri='/test/other/',
headers=headers)
assert response.text == 'Hello3'
def test_bp_middleware(): def test_bp_middleware():
app = Sanic('test_middleware') app = Sanic('test_middleware')
@ -162,4 +227,4 @@ def test_bp_static():
request, response = sanic_endpoint_test(app, uri='/testing.file') request, response = sanic_endpoint_test(app, uri='/testing.file')
assert response.status == 200 assert response.status == 200
assert response.body == current_file_contents assert response.body == current_file_contents