>>> from django.utils.regex_helper import normalize
>>> bits=normalize(r'^static/(?P<path>.*)$')
>>> bits
[(u'static/%(path)s', [u'path'])]
>>> bits=normalize(r'^static/(?P<path>.*)/(?P<order>.*)$')
>>> bits
[(u'static/%(path)s/%(order)s', [u'path', u'order'])]
normalize函数返回列表,列表的元素是元组,元组的第一项是字符串,第二项是组名字。

django.conf.url可以导入include,patterns,url等函数
def include(arg, namespace=None, app_name=None):
if app_name and not namespace:
raise ValueError('Must specify a namespace if specifying app_name.')
if app_name:
warnings.warn(
'The app_name argument to django.conf.urls.include() is deprecated. '
'Set the app_name in the included URLconf instead.',
RemovedInDjango20Warning, stacklevel=2
) if isinstance(arg, tuple):
# callable returning a namespace hint
try:
urlconf_module, app_name = arg
except ValueError:
if namespace:
raise ImproperlyConfigured(
'Cannot override the namespace for a dynamic module that provides a namespace'
)
warnings.warn(
'Passing a 3-tuple to django.conf.urls.include() is deprecated. '
'Pass a 2-tuple containing the list of patterns and app_name, '
'and provide the namespace argument to include() instead.',
RemovedInDjango20Warning, stacklevel=2
)
urlconf_module, app_name, namespace = arg
else:
# No namespace hint - use manually provided namespace
urlconf_module = arg if isinstance(urlconf_module, six.string_types):#urlconf_module可以是字符串,导入该字符串
urlconf_module = import_module(urlconf_module)
patterns = getattr(urlconf_module, 'urlpatterns', urlconf_module)
app_name = getattr(urlconf_module, 'app_name', app_name)
if namespace and not app_name:
warnings.warn(
'Specifying a namespace in django.conf.urls.include() without '
'providing an app_name is deprecated. Set the app_name attribute '
'in the included module, or pass a 2-tuple containing the list of '
'patterns and app_name instead.',
RemovedInDjango20Warning, stacklevel=2
) namespace = namespace or app_name # Make sure we can iterate through the patterns (without this, some
# testcases will break).
if isinstance(patterns, (list, tuple)):
for url_pattern in patterns:
# Test if the LocaleRegexURLResolver is used within the include;
# this should throw an error since this is not allowed!
if isinstance(url_pattern, LocaleRegexURLResolver):
raise ImproperlyConfigured(
'Using i18n_patterns in an included URLconf is not allowed.') return (urlconf_module, app_name, namespace) def patterns(prefix, *args):#返回列表
warnings.warn(
'django.conf.urls.patterns() is deprecated and will be removed in '
'Django 1.10. Update your urlpatterns to be a list of '
'django.conf.urls.url() instances instead.',
RemovedInDjango110Warning, stacklevel=2
)
pattern_list = []
for t in args:
if isinstance(t, (list, tuple)):
t = url(prefix=prefix, *t)
elif isinstance(t, RegexURLPattern):
t.add_prefix(prefix)
pattern_list.append(t)
return pattern_list def url(regex, view, kwargs=None, name=None, prefix=''):
if isinstance(view, (list, tuple)):#返回RegexURLResolver对象
# For include(...) processing.
urlconf_module, app_name, namespace = view
return RegexURLResolver(regex, urlconf_module, kwargs, app_name=app_name, namespace=namespace)
else:
if isinstance(view, six.string_types):
warnings.warn(
'Support for string view arguments to url() is deprecated and '
'will be removed in Django 1.10 (got %s). Pass the callable '
'instead.' % view,
RemovedInDjango110Warning, stacklevel=2
)
if not view:
raise ImproperlyConfigured('Empty URL pattern view name not permitted (for pattern %r)' % regex)
if prefix:
view = prefix + '.' + view
return RegexURLPattern(regex, view, kwargs, name)#返回RegexURLPattern
class RegexURLResolver(LocaleRegexProvider):
def __init__(self, regex, urlconf_name, default_kwargs=None, app_name=None, namespace=None):
print "i am regxurlresolver"
LocaleRegexProvider.__init__(self, regex)
# urlconf_name is the dotted Python path to the module defining
# urlpatterns. It may also be an object with an urlpatterns attribute
# or urlpatterns itself.
self.urlconf_name = urlconf_name
self.callback = None
self.default_kwargs = default_kwargs or {}
self.namespace = namespace
self.app_name = app_name
self._reverse_dict = {}
self._namespace_dict = {}
self._app_dict = {}
# set of dotted paths to all functions and classes that are used in
# urlpatterns
self._callback_strs = set()
self._populated = False def __repr__(self):
if isinstance(self.urlconf_name, list) and len(self.urlconf_name):
# Don't bother to output the whole list, it can be huge
urlconf_repr = '<%s list>' % self.urlconf_name[0].__class__.__name__
else:
urlconf_repr = repr(self.urlconf_name)
return str('<%s %s (%s:%s) %s>') % (
self.__class__.__name__, urlconf_repr, self.app_name,
self.namespace, self.regex.pattern) def _populate(self):#初始化时会递归调用
lookups = MultiValueDict()
namespaces = {}
apps = {}
language_code = get_language()
for pattern in reversed(self.url_patterns):#urls.py的urlpattern
if hasattr(pattern, '_callback_str'):#回调字符串集可以用来判断是否可回调
self._callback_strs.add(pattern._callback_str)
elif hasattr(pattern, '_callback'):#回调对象转换为字符串
callback = pattern._callback
if isinstance(callback, functools.partial):
callback = callback.func if not hasattr(callback, '__name__'):
lookup_str = callback.__module__ + "." + callback.__class__.__name__
else:
lookup_str = callback.__module__ + "." + callback.__name__
self._callback_strs.add(lookup_str)
p_pattern = pattern.regex.pattern#取得 RegexURLPattern对象的正则
if p_pattern.startswith('^'):
p_pattern = p_pattern[1:]
if isinstance(pattern, RegexURLResolver):
if pattern.namespace:
namespaces[pattern.namespace] = (p_pattern, pattern)
if pattern.app_name:
apps.setdefault(pattern.app_name, []).append(pattern.namespace)
else:
parent_pat = pattern.regex.pattern#取得模式字符串
for name in pattern.reverse_dict:#会使得RegexURLResolver对象_populate()
for matches, pat, defaults in pattern.reverse_dict.getlist(name):
new_matches = normalize(parent_pat + pat)#完善该名字对应的内容
lookups.appendlist(
name,
(
new_matches,
p_pattern + pat,
dict(defaults, **pattern.default_kwargs),
)
)
for namespace, (prefix, sub_pattern) in pattern.namespace_dict.items():
namespaces[namespace] = (p_pattern + prefix, sub_pattern)
for app_name, namespace_list in pattern.app_dict.items():
apps.setdefault(app_name, []).extend(namespace_list)
self._callback_strs.update(pattern._callback_strs)
else:
bits = normalize(p_pattern)
lookups.appendlist(pattern.callback, (bits, p_pattern, pattern.default_args))
if pattern.name is not None:
lookups.appendlist(pattern.name, (bits, p_pattern, pattern.default_args)) self._reverse_dict[language_code] = lookups
self._namespace_dict[language_code] = namespaces
self._app_dict[language_code] = apps
self._populated = True

第一次查找视图函数时,会调用_populate,这样会使得各个urls.py模板都解决。

mezzanine的urlresolver

In [27]: url.__dict__
Out[27]:
{'_app_dict': {u'en': {'admin': ['admin']}},
 '_callback_strs': {u'django.contrib.auth.admin.user_change_password',
  u'django.contrib.auth.views.password_reset',
  u'django.contrib.auth.views.password_reset_complete',
  u'django.contrib.auth.views.password_reset_confirm',
  u'django.contrib.auth.views.password_reset_done',
  u'django.contrib.sitemaps.views.sitemap',
  u'django.views.i18n.javascript_catalog',
  u'filebrowser_safe.decorators.decorator',
  u'filebrowser_safe.views._check_file',
  u'filebrowser_safe.views.browse',
  u'filebrowser_safe.views.delete',
  u'filebrowser_safe.views.mkdir',
  u'filebrowser_safe.views.rename',
  u'filebrowser_safe.views.upload',
  u'mezzanine.blog.views.blog_post_detail',
  u'mezzanine.blog.views.blog_post_feed',
  u'mezzanine.blog.views.blog_post_list',
  u'mezzanine.boot.lazy_admin.<lambda>',
  u'mezzanine.core.views.direct_to_template',
  u'mezzanine.core.views.displayable_links_js',
  u'mezzanine.core.views.edit',
  u'mezzanine.core.views.search',
  u'mezzanine.core.views.set_device',
  u'mezzanine.core.views.set_site',
  u'mezzanine.core.views.static_proxy',
  u'mezzanine.generic.views.admin_keywords_submit',
  u'mezzanine.generic.views.comment',
  u'mezzanine.generic.views.rating',
  u'mezzanine.pages.views.admin_page_ordering',
  u'mezzanine.pages.views.page'},
 '_namespace_dict': {u'en': {'admin': (u'admin/',
    <RegexURLResolver <RegexURLPattern list> (admin:admin) >)}},
 '_populated': True,
 '_regex': u'^/',
 '_regex_dict': {},
 '_reverse_dict': {u'en': <MultiValueDict: {u'comment': [([(u'comment/', [])], u
'comment/$', {})], u'rating': [([(u'rating/', [])], u'rating/$', {})], u'admin_k
eywords_submit': [([(u'admin_keywords_submit/', [])], u'admin_keywords_submit/$'
, {})], <function comment at 0x035C8830>: [([(u'comment/', [])], u'comment/$', {
})], u'fb_rename': [([(u'admin/media-library/rename/', [])], u'admin/media-libra
ry/rename/$', {})], u'blog_post_list_month': [([(u'blog/archive/%(year)s/%(month
)s/', [u'year', u'month'])], u'blog/archive/(?P<year>\\d{4})/(?P<month>\\d{1,2})
/$', {})], u'fb_mkdir': [([(u'admin/media-library/mkdir/', [])], u'admin/media-l
ibrary/mkdir/', {})], u'blog_post_list_author': [([(u'blog/author/%(username)s/'
, [u'username'])], u'blog/author/(?P<username>.*)/$', {})], u'set_device': [([(u
'set_device/%(device)s/', [u'device'])], u'set_device/(?P<device>.*)/$', {})], u
'blog_post_list_category': [([(u'blog/category/%(category)s/', [u'category'])],
u'blog/category/(?P<category>.*)/$', {})], <function _check_file at 0x035EA530>:
 [([(u'admin/media-library/check_file/', [])], u'admin/media-library/check_file/
$', {})], <function static_proxy at 0x035B0130>: [([(u'asset_proxy/', [])], u'as
set_proxy/$', {})], <function user_change_password at 0x035EA930>: [([(u'admin/a
uth/user/%(_0)s/password/', [u'_0'])], u'admin/auth/user/(\\d+)/password/$', {})
], u'blog_post_detail_day': [([(u'blog/%(year)s/%(month)s/%(day)s/%(slug)s/', [u
'year', u'month', u'day', u'slug'])], u'blog/(?P<year>\\d{4})/(?P<month>\\d{1,2}
)/(?P<day>\\d{1,2})/(?P<slug>.*)/$', {})], u'home': [([(u'', [])], u'$', {u'temp
late': u'index.html'})], u'displayable_links_js': [([(u'displayable_links.js', [
])], u'displayable_links.js$', {})], <function blog_post_list at 0x035C89B0>: [(
[(u'blog/', [])], u'blog/$', {}), ([(u'blog/archive/%(year)s/', [u'year'])], u'b
log/archive/(?P<year>\\d{4})/$', {}), ([(u'blog/archive/%(year)s/%(month)s/', [u
'year', u'month'])], u'blog/archive/(?P<year>\\d{4})/(?P<month>\\d{1,2})/$', {})
, ([(u'blog/author/%(username)s/', [u'username'])], u'blog/author/(?P<username>.
*)/$', {}), ([(u'blog/category/%(category)s/', [u'category'])], u'blog/category/
(?P<category>.*)/$', {}), ([(u'blog/tag/%(tag)s/', [u'tag'])], u'blog/tag/(?P<ta
g>.*)/$', {})], <function rename at 0x035EA8B0>: [([(u'admin/media-library/renam
e/', [])], u'admin/media-library/rename/$', {})], <function blog_post_detail at
0x0361B770>: [([(u'blog/%(slug)s/', [u'slug'])], u'blog/(?P<slug>.*)/$', {}), ([
(u'blog/%(year)s/%(slug)s/', [u'year', u'slug'])], u'blog/(?P<year>\\d{4})/(?P<s
lug>.*)/$', {}), ([(u'blog/%(year)s/%(month)s/%(slug)s/', [u'year', u'month', u'
slug'])], u'blog/(?P<year>\\d{4})/(?P<month>\\d{1,2})/(?P<slug>.*)/$', {}), ([(u
'blog/%(year)s/%(month)s/%(day)s/%(slug)s/', [u'year', u'month', u'day', u'slug'
])], u'blog/(?P<year>\\d{4})/(?P<month>\\d{1,2})/(?P<day>\\d{1,2})/(?P<slug>.*)/
$', {})], <function direct_to_template at 0x035B0270>: [([(u'', [])], u'$', {u't
emplate': u'index.html'})], <function rating at 0x035C8870>: [([(u'rating/', [])
], u'rating/$', {})], u'blog_post_detail': [([(u'blog/%(slug)s/', [u'slug'])], u
'blog/(?P<slug>.*)/$', {})], <function displayable_links_js at 0x035B0330>: [([(
u'displayable_links.js', [])], u'displayable_links.js$', {})], <function sitemap
 at 0x035EAB70>: [([(u'sitemap.xml', [])], u'sitemap\\.xml$', {u'sitemaps': {u'a
ll': <class 'mezzanine.core.sitemaps.DisplayableSitemap'>}})], <function mkdir a
t 0x035EA3F0>: [([(u'admin/media-library/mkdir/', [])], u'admin/media-library/mk
dir/', {})], <function search at 0x035B03B0>: [([(u'search/', [])], u'search/$',
 {})], u'blog_post_detail_year': [([(u'blog/%(year)s/%(slug)s/', [u'year', u'slu
g'])], u'blog/(?P<year>\\d{4})/(?P<slug>.*)/$', {})], u'blog_post_list_tag': [([
(u'blog/tag/%(tag)s/', [u'tag'])], u'blog/tag/(?P<tag>.*)/$', {})], u'user_chang
e_password': [([(u'admin/auth/user/%(_0)s/password/', [u'_0'])], u'admin/auth/us
er/(\\d+)/password/$', {})], u'blog_post_list': [([(u'blog/', [])], u'blog/$', {
})], u'blog_post_feed_tag': [([(u'blog/tag/%(tag)s/feeds/%(format)s/', [u'tag',
u'format'])], u'blog/tag/(?P<tag>.*)/feeds/(?P<format>.*)/$', {})], <function bl
og_post_feed at 0x0361BC70>: [([(u'blog/author/%(username)s/feeds/%(format)s/',
[u'username', u'format'])], u'blog/author/(?P<username>.*)/feeds/(?P<format>.*)/
$', {}), ([(u'blog/category/%(category)s/feeds/%(format)s/', [u'category', u'for
mat'])], u'blog/category/(?P<category>.*)/feeds/(?P<format>.*)/$', {}), ([(u'blo
g/tag/%(tag)s/feeds/%(format)s/', [u'tag', u'format'])], u'blog/tag/(?P<tag>.*)/
feeds/(?P<format>.*)/$', {}), ([(u'blog/feeds/%(format)s/', [u'format'])], u'blo
g/feeds/(?P<format>.*)/$', {})], u'fb_browse': [([(u'admin/media-library/browse/
', [])], u'admin/media-library/browse/$', {})], <function admin_keywords_submit
at 0x035C87F0>: [([(u'admin_keywords_submit/', [])], u'admin_keywords_submit/$',
 {})], u'blog_post_feed_author': [([(u'blog/author/%(username)s/feeds/%(format)s
/', [u'username', u'format'])], u'blog/author/(?P<username>.*)/feeds/(?P<format>
.*)/$', {})], u'blog_post_feed_category': [([(u'blog/category/%(category)s/feeds
/%(format)s/', [u'category', u'format'])], u'blog/category/(?P<category>.*)/feed
s/(?P<format>.*)/$', {})], u'search': [([(u'search/', [])], u'search/$', {})], <
function page at 0x02A92CF0>: [([(u'%(slug)s/', [u'slug'])], u'(?P<slug>.*)/$',
{})], <function set_device at 0x035B00B0>: [([(u'set_device/%(device)s/', [u'dev
ice'])], u'set_device/(?P<device>.*)/$', {})], u'password_reset_done': [([(u'pas
sword_reset/done/', [])], u'password_reset/done/$', {})], u'fb_check': [([(u'adm
in/media-library/check_file/', [])], u'admin/media-library/check_file/$', {})],
<function admin_page_ordering at 0x02A92D30>: [([(u'admin_page_ordering/', [])],
 u'admin_page_ordering/$', {})], u'fb_upload': [([(u'admin/media-library/upload/
', [])], u'admin/media-library/upload/', {})], u'blog_post_detail_month': [([(u'
blog/%(year)s/%(month)s/%(slug)s/', [u'year', u'month', u'slug'])], u'blog/(?P<y
ear>\\d{4})/(?P<month>\\d{1,2})/(?P<slug>.*)/$', {})], <function browse at 0x035
EA2F0>: [([(u'admin/media-library/browse/', [])], u'admin/media-library/browse/$
', {})], u'static_proxy': [([(u'asset_proxy/', [])], u'asset_proxy/$', {})], <fu
nction upload at 0x035EA4F0>: [([(u'admin/media-library/upload/', [])], u'admin/
media-library/upload/', {})], <function delete at 0x035EA7B0>: [([(u'admin/media
-library/delete/', [])], u'admin/media-library/delete/$', {})], <function passwo
rd_reset at 0x02A925F0>: [([(u'password_reset/', [])], u'password_reset/$', {})]
, <function set_site at 0x035B0030>: [([(u'set_site/', [])], u'set_site/$', {})]
, u'password_reset_complete': [([(u'reset/done/', [])], u'reset/done/$', {})], <
function edit at 0x035B0430>: [([(u'edit/', [])], u'edit/$', {})], u'blog_post_l
ist_year': [([(u'blog/archive/%(year)s/', [u'year'])], u'blog/archive/(?P<year>\
\d{4})/$', {})], <function javascript_catalog at 0x03571870>: [([(u'jsi18n/%(pac
kages)s/', [u'packages'])], u'jsi18n/(?P<packages>\\S+?)/$', {u'domain': u'djang
o'})], <function password_reset_done at 0x02A92670>: [([(u'password_reset/done/'
, [])], u'password_reset/done/$', {})], u'edit': [([(u'edit/', [])], u'edit/$',
{})], u'password_reset_confirm': [([(u'reset/%(uidb64)s/%(token)s/', [u'uidb64',
 u'token'])], u'reset/(?P<uidb64>[0-9A-Za-z_\\-]+)/(?P<token>.+)/$', {})], <func
tion decorator at 0x035EA670>: [([(u'admin/media-library/upload_file/', [])], u'
admin/media-library/upload_file/$', {})], u'fb_do_upload': [([(u'admin/media-lib
rary/upload_file/', [])], u'admin/media-library/upload_file/$', {})], u'fb_delet
e': [([(u'admin/media-library/delete/', [])], u'admin/media-library/delete/$', {
})], <function <lambda> at 0x035B06F0>: [([(u'admin/media-library/', [])], u'adm
in/media-library/$', {})], u'password_reset': [([(u'password_reset/', [])], u'pa
ssword_reset/$', {})], u'media-library': [([(u'admin/media-library/', [])], u'ad
min/media-library/$', {})], u'blog_post_feed': [([(u'blog/feeds/%(format)s/', [u
'format'])], u'blog/feeds/(?P<format>.*)/$', {})], u'admin_page_ordering': [([(u
'admin_page_ordering/', [])], u'admin_page_ordering/$', {})], u'set_site': [([(u
'set_site/', [])], u'set_site/$', {})], <function password_reset_confirm at 0x02
A927B0>: [([(u'reset/%(uidb64)s/%(token)s/', [u'uidb64', u'token'])], u'reset/(?
P<uidb64>[0-9A-Za-z_\\-]+)/(?P<token>.+)/$', {})], u'page': [([(u'%(slug)s/', [u
'slug'])], u'(?P<slug>.*)/$', {})], <function password_reset_complete at 0x02A92
7F0>: [([(u'reset/done/', [])], u'reset/done/$', {})]}>},
 'app_name': None,
 'callback': None,
 'default_kwargs': {},
 'namespace': None,
 'url_patterns': [<RegexURLResolver <RegexURLPattern list> (None:None) ^admin/>,

<RegexURLPattern home ^$>,
  <RegexURLResolver <module 'mezzanine.urls' from 'c:\python27\lib\site-packages
\mezzanine\urls.pyc'> (None:None) ^>],
 'urlconf_module': <module 'mez.urls' from 'C:\mez\mez\urls.pyc'>,
 'urlconf_name': u'mez.urls'}

django之urlresolver的更多相关文章

  1. Django 源码小剖: URL 调度器(URL dispatcher)

    在刚开始接触 django 的时候, 我们尝试着从各种入门文档中创建一个自己的 django 项目, 需要在 mysite.urls.py 中配置 URL. 这是 django url 匹配处理机制的 ...

  2. URL 调度器(URL dispatcher)

    URL 调度器(URL dispatcher) 在刚开始接触 django 的时候, 我们尝试着从各种入门文档中创建一个自己的 django 项目, 需要在 mysite.urls.py 中配置 UR ...

  3. Django学习之十一:真正理解Django的路由分发和反解url原理

    目录 URL Dispatcher 简介 模式概念 对比URLPattern 与 URLResolver (多态的体现) 构建子路由几种方式 反解url算法逻辑 URL Dispatcher 简介 d ...

  4. Django学习之七:Django 中间件

    目录 Django 中间件 自定义中间件 - - - 大体两种方式 将中间件移除 实例 中间件加载源码阅读 总结 Django 中间件 Tips: 更新日志: 2019.01.31 更新django中 ...

  5. Django学习笔记之URL与视图

    视图 视图一般都写在app的views.py中.并且视图的第一个参数永远都是request(一个HttpRequest)对象.这个对象存储了这个http请求的所有信息,其中包括携带的参数以及一些头部信 ...

  6. Django自动获取项目中的全部URL

    import re from collections import OrderedDict from django.conf import settings from django.utils.mod ...

  7. Django url分发器

    视图: 视图一般都写在app的views.py中.并且视图的第一个参数永远都是request(一个HttpRequest)对象.这个对象存储了请求过来的所有信息,包括携带的参数以及一些头部信息等.在视 ...

  8. Django(二):url和views

    网络通讯的本质是socket,从socket封装到MVC模式,参见另外几篇博客.本节笔记整理自Django2.0官方文档. 一.url调度器 - django.urls.path django2.0中 ...

  9. Django REST framework完全入门

    Django REST framework 一个强大灵活的Django工具包,提供了便捷的 REST API 开发框架 我们用传统的django也可以实现REST风格的api,但是顶不住Django ...

随机推荐

  1. <亲测>CentOS7中使用yum安装Nginx的方法

    CentOS7中使用yum安装Nginx的方法   最近无意间发现Nginx官方提供了Yum源.因此写个文章记录下. 1.添加源 默认情况Centos7中无Nginx的源,最近发现Nginx官网提供了 ...

  2. NIO基本操作

    NIO是Java 4里面提供的新的API,目的是用来解决传统IO的问题 NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区), Selector(选择器) Channel(通道) ...

  3. pytest.4.Fixture

    From: http://www.testclass.net/pytest/fixture/ 我们可以简单的把Fixture理解为准备测试数据和初始化测试对象的阶段. 一般我们对测试数据和测试对象的管 ...

  4. C++中sort函数小结

    我们都知道,sort函数是C++标准库<algorithm>中的一个库函数.它的功能是对数组/容器中的元素进行排序.用法示例如下: 一.对数组进行排序 示例: int a[] = {1,3 ...

  5. Ubuntu 14.10 下安装rabbitvcs-版本控制

    在Windows下用惯了TortoiseSVN这只小乌龟,到了Ubuntu下很不习惯命令行的SVN,于是经过一番寻找安装了RabbitVCS这款SVN图形化前端工具(官方网站:http://rabbi ...

  6. django获取表单数据

    django获取单表数据的三种方式 v1 = models.Business.objects.all() # v1是QuerySet的列表 ,内部元素都是对象 v2 = models.Business ...

  7. [翻译]Restful Web服务模型

    最近我一直在阅读“Rest实践”的草稿:一本几位同事一直在努力编写的书. 他们的目的是解释如何使用Restful Web服务来处理企业面临的许多集成问题. 这本书的核心在于这样一种观点,Web以一个有 ...

  8. 在Express中使用Multiparty进行文件上传及POST、GET参数获取

    Express 版本:4.14.1 在Express中,文件上传需要用到multiparty中间件,在项目目录中,通过npm install multiparty –save进行安装必要组件. 前端H ...

  9. [UE4]Uniform Grid Panel

    Uniform Grid Panel:统一大小网格 一.如果不设置子控件的Row和Column值,就跟Overlay容器一样的重叠. 二.选中Uniform Grid Panel,可以设置其内的子控件 ...

  10. 知识点:java 注解 @SuppressWarnings

    前言: 简介:java.lang.SuppressWarnings是J2SE5.0中标准的Annotation之一.可以标注在类.字段.方法.参数.构造方法,以及局部变量上.作用:告诉编译器忽略指定的 ...