您的位置:首页 > 编程语言 > Go语言

仿照django的urls风格和模块化结构的flask项目(Django-Style URL Patterns for Flask)

2017-07-19 09:52 495 查看


Django-Style URL Patterns for Flask

django的urls集中式路由控制相比flask通过装饰器来控制的确很一目了然,习惯了django的urls模式,突然改到flask还有点怀念,于是通过Flask.add_url_rule函数实现了一个仿django的urls模式。

github: https://github.com/pushiqiang/flask_url/tree/master/blog

目录结构

blog

      ---__init__.py

      ---settings.py

      ---urls.py

      ---views.py

post

      ---__init__.py

      ---urls.py

      ---views.py

url_resolvers

      ---__init__.py

      ---resolvers.py

     

注册urls.py的映射:

url_resolvers/resolvers.py

# -*- coding: utf-8 -*-

import os
from importlib import import_module

import six
from exceptions import ImproperlyConfigured

class URLPattern(object):
def __init__(self, regex, view, name, kwargs):
self.regex = regex
self.view = view
self.kwargs = kwargs
self.name = name

class URLIncludePatterns(object):
def __init__(self, urlconf_module):
self.patterns = []
if isinstance(urlconf_module, six.string_types):
try:
urlconf_module = import_module(urlconf_module)
except ImportError:
raise ImproperlyConfigured('Urls is not configured correctly')

self.patterns = getattr(urlconf_module, 'urlpatterns')
if filter(lambda pattern: isinstance(pattern, URLIncludePatterns), self.patterns):
raise ImproperlyConfigured(
'Using included patterns in an included URLconf is not allowed.')

class RegexURLResolver(object):
def __init__(self, regex, include, kwargs):
self.patterns = include.patterns
self.regex = regex
self.kwargs = kwargs
for pattern in self.patterns:
if pattern.regex.startswith('/'):
pattern.regex = os.path.join(regex, pattern.regex.lstrip('/'))
else:
pattern.regex = os.path.join(regex, pattern.regex)

def url(regex, view, name=None, kwargs=None):
# include
if isinstance(view, URLIncludePatterns):
return RegexURLResolver(regex, view, kwargs)
# url
elif callable(view):
return URLPattern(regex, view, name, kwargs)
else:
raise TypeError('view must be a callable or a list/tuple in the case of include().')

include = URLIncludePatterns

def auto_register_url(app):
"""
自动注册url映射
"""
try:
urlconf_module = import_module(app.config['ROOT_URLCONF'])
except (KeyError, ImportError):
raise ImproperlyConfigured('ROOT_URLCONF is not configured correctly')

url_patterns = getattr(urlconf_module, 'urlpatterns')
for url_pattern in url_patterns:
if isinstance(url_pattern, URLPattern):
app.add_url_rule(
url_pattern.regex,
endpoint=url_pattern.name,
view_func=url_pattern.view
)
else:
for pattern in url_pattern.patterns:
app.add_url_rule(
pattern.regex,
endpoint=pattern.name,
view_func=pattern.view
)


使用:

__init__.py

# -*- coding: utf-8 -*-

import os
from flask import Flask

from url_resolvers.resolvers import auto_register_url

import settings

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

app = Flask(__name__)
app.config.from_object(settings)

# 自动注册urls路径
auto_register_url(app)


配置:

settings.py

# -*- encoding: utf-8 -*-
"""
配置文件
"""

ROOT_URLCONF = 'blog.urls'


example:

# 根urls.py配置
# -*- coding: utf-8 -*-

from url_resolvers.resolvers import url, include

from views import home

urlpatterns = [
url('/home/', home, ),
url('/post/', include('post.urls')),
]

# app  urls.py
# -*- coding: utf-8 -*-

from url_resolvers.resolvers import url, include

from .views import index

urlpatterns = [
url('index/', index, name='index'),
]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: