Они - оба то же самое, много элементов платформы представляет свойство имени самих, но для тех, которые не делают можно использовать x:name - я обычно просто придерживаюсь x:name, потому что это работает на все.
Средства управления могут представить, называют себя как Свойство Зависимости, если они хотят к (потому что они должны использовать то Свойство Зависимости внутренне), или они могут выбрать не к.
[еще 115] детали в msdn здесь и здесь :
Некоторые приложения уровня платформы WPF могли бы быть в состоянии избежать любого использования атрибута x:Name, потому что свойство зависимости от Имени, столь же указанное в пространстве имен WPF для нескольких из важных базовых классов, таких как FrameworkElement/FrameworkContentElement, удовлетворяет эту ту же цель. Существует все еще некоторый общий XAML и сценарии платформы, где доступ кода к элементу без свойства Name необходим, прежде всего в определенной анимации и классах поддержки раскадровки. Например, Вы должны определить x:Name на временных шкалах и преобразовываете созданный в XAML, если Вы намереваетесь сослаться на них от кода.
, Если Имя доступно как свойство на классе, Имя и x:Name могут использоваться попеременно в качестве атрибутов, но ошибка закончится, если оба будут определены на том же элементе.
Небольшое регулярное выражение:
import re
reg=re.compile('(\w+)[:=] ?"?(\w+)"?')
>>>dict(reg.findall(headers))
{'username': 'Foobear', 'realm': 'testrealm', 'qop': 'chap', 'cnonce': '5ccc069c403ebaf9f0171e9517f40e41', 'response': '6629fae49393a05397450978507c4ef1', 'Authorization': 'Digest'}
Вы также можете использовать urllib2, как CheryPy .
вот фрагмент:
input= """
Authorization: Digest qop="chap",
realm="testrealm@host.com",
username="Foobear",
response="6629fae49393a05397450978507c4ef1",
cnonce="5ccc069c403ebaf9f0171e9517f40e41"
"""
import urllib2
field, sep, value = input.partition("Authorization: Digest ")
if value:
items = urllib2.parse_http_list(value)
opts = urllib2.parse_keqv_list(items)
opts['protocol'] = 'Digest'
print opts
он выводит:
{'username': 'Foobear', 'protocol': 'Digest', 'qop': 'chap', 'cnonce': '5ccc069c403ebaf9f0171e9517f40e41', 'realm': 'testrealm@host.com', 'response': '6629fae49393a05397450978507c4ef1'}
Я бы порекомендовал найти правильную библиотеку для анализа заголовков http, к сожалению, я не могу повторно вызвать их. : (
Некоторое время просмотрите фрагмент ниже (в основном он должен работать):
input= """
Authorization: Digest qop="chap",
realm="testrealm@host.com",
username="Foob,ear",
response="6629fae49393a05397450978507c4ef1",
cnonce="5ccc069c403ebaf9f0171e9517f40e41"
"""
field, sep, value = input.partition(":")
if field.endswith('Authorization'):
protocol, sep, opts_str = value.strip().partition(" ")
opts = {}
for opt in opts_str.split(",\n"):
key, value = opt.strip().split('=')
key = key.strip(" ")
value = value.strip(' "')
opts[key] = value
opts['protocol'] = protocol
print opts
Если эти компоненты всегда будут там, то регулярное выражение поможет:
test = '''Authorization: Digest qop="chap", realm="testrealm@host.com", username="Foobear", response="6629fae49393a05397450978507c4ef1", cnonce="5ccc069c403ebaf9f0171e9517f40e41"'''
import re
re_auth = re.compile(r"""
Authorization:\s*(?P<protocol>[^ ]+)\s+
qop="(?P<qop>[^"]+)",\s+
realm="(?P<realm>[^"]+)",\s+
username="(?P<username>[^"]+)",\s+
response="(?P<response>[^"]+)",\s+
cnonce="(?P<cnonce>[^"]+)"
""", re.VERBOSE)
m = re_auth.match(test)
print m.groupdict()
производит:
{ 'username': 'Foobear',
'protocol': 'Digest',
'qop': 'chap',
'cnonce': '5ccc069c403ebaf9f0171e9517f40e41',
'realm': 'testrealm@host.com',
'response': '6629fae49393a05397450978507c4ef1'
}
Ваша первоначальная концепция использования PyParsing была бы лучшим подходом. То, о чем вы неявно просили, - это то, что требует грамматики ... то есть регулярное выражение или простая процедура синтаксического анализа всегда будут хрупкими, и похоже, что вы пытаетесь этого избежать.
Похоже, что получить pyparsing в движке приложений Google очень просто: Как мне настроить PyParsing в движке Google App?
Так что я бы пошел с этим, а затем реализовал полную поддержку HTTP-заголовка аутентификации / авторизации из rfc2617.
Если ваш ответ состоит из одной строки, которая никогда не меняется и содержит столько строк, сколько есть выражений для сопоставления , вы можете разделить его на массив с символом новой строки, называемый authentication_array
, и использовать регулярные выражения:
pattern_array = ['qop', 'realm', 'username', 'response', 'cnonce']
i = 0
parsed_dict = {}
for line in authentication_array:
pattern = "(" + pattern_array[i] + ")" + "=(\".*\")" # build a matching pattern
match = re.search(re.compile(pattern), line) # make the match
if match:
parsed_dict[match.group(1)] = match.group(2)
i += 1
Вот моя попытка парсинга:
text = """Authorization: Digest qop="chap",
realm="testrealm@host.com",
username="Foobear",
response="6629fae49393a05397450978507c4ef1",
cnonce="5ccc069c403ebaf9f0171e9517f40e41" """
from pyparsing import *
AUTH = Keyword("Authorization")
ident = Word(alphas,alphanums)
EQ = Suppress("=")
quotedString.setParseAction(removeQuotes)
valueDict = Dict(delimitedList(Group(ident + EQ + quotedString)))
authentry = AUTH + ":" + ident("protocol") + valueDict
print authentry.parseString(text).dump()
, которая выводит:
['Authorization', ':', 'Digest', ['qop', 'chap'], ['realm', 'testrealm@host.com'],
['username', 'Foobear'], ['response', '6629fae49393a05397450978507c4ef1'],
['cnonce', '5ccc069c403ebaf9f0171e9517f40e41']]
- cnonce: 5ccc069c403ebaf9f0171e9517f40e41
- protocol: Digest
- qop: chap
- realm: testrealm@host.com
- response: 6629fae49393a05397450978507c4ef1
- username: Foobear
Я не знаком с RFC, но надеюсь, что это поможет вам.
Поле заголовка авторизации http-дайджеста выглядит довольно странно. Его формат аналогичен формату полей заголовков Cache-Control и Content-Type rfc 2616 , но достаточно отличается, чтобы быть несовместимыми. Если вы все еще ищете библиотеку, которая немного умнее и читабельнее, чем регулярное выражение, вы можете попробовать удалить часть Authorization: Digest с помощью str.split () и проанализировать остальное с помощью parse_dict_header () из http-модуля Werkzeug . (Werkzeug можно установить в App Engine.)