Fix TypeError when use Blueprint.group() to group blueprint with default url_prefix, Use os.path.normpath to avoid invalid url_prefix like api//v1

This commit is contained in:
jacob 2018-09-29 18:23:16 +08:00
parent 076cf51fb2
commit bd6dbd9090
2 changed files with 41 additions and 0 deletions

View File

@ -1,3 +1,4 @@
import os
from collections import defaultdict, namedtuple from collections import defaultdict, namedtuple
from sanic.constants import HTTP_METHODS from sanic.constants import HTTP_METHODS
@ -54,7 +55,10 @@ class Blueprint:
yield i yield i
bps = [] bps = []
for bp in chain(blueprints): for bp in chain(blueprints):
if bp.url_prefix is None:
bp.url_prefix = ''
bp.url_prefix = url_prefix + bp.url_prefix bp.url_prefix = url_prefix + bp.url_prefix
bp.url_prefix = os.path.normpath(bp.url_prefix)
bps.append(bp) bps.append(bp)
return bps return bps

View File

@ -499,3 +499,40 @@ def test_bp_group(app):
request, response = app.test_client.get('/mid/deep1/bottom') request, response = app.test_client.get('/mid/deep1/bottom')
assert response.text == 'D1B_OK' assert response.text == 'D1B_OK'
def test_bp_group_with_default_url_prefix(app):
from sanic.response import json
bp_resources = Blueprint('bp_resources')
@bp_resources.get('/')
def list_resources_handler(request):
resource = {}
return json([resource])
bp_resource = Blueprint('bp_resource', url_prefix='/<resource_id>')
@bp_resource.get('/')
def get_resource_hander(request, resource_id):
resource = {'resource_id': resource_id}
return json(resource)
bp_resources_group = Blueprint.group(bp_resources, bp_resource, url_prefix='/resources/')
bp_api_v1 = Blueprint('bp_api_v1', url_prefix='/')
@bp_api_v1.get('/info')
def api_v1_info(request):
return text('api_version: v1')
bp_api_v1_group = Blueprint.group(bp_api_v1, bp_resources_group, url_prefix='/v1')
bp_api_group = Blueprint.group(bp_api_v1_group, url_prefix='/api')
app.blueprint(bp_api_group)
request, response = app.test_client.get('/api/v1/info')
assert response.text == 'api_version: v1'
request, response = app.test_client.get('/api/v1/resources')
assert response.json == [{}]
from uuid import uuid4
resource_id = str(uuid4())
request, response = app.test_client.get('/api/v1/resources/{0}'.format(resource_id))
assert response.json == {'resource_id': resource_id}