Имя файла не может содержать символы из символов Path.GetInvalidPathChars ()
, +
и #
и других конкретных имен. Мы объединили все проверки в один класс:
public static class FileNameExtensions {private static readonly Lazy & lt; string [] & gt; InvalidFileNameChars = new Lazy & lt; string [] & gt; (() = & gt; Path.GetInvalidPathChars () .Union (Path.GetInvalidFileNameChars () .Union (new [] {'+', '#'})). Выберите (c = & gt; c.ToString (CultureInfo.InvariantCulture)). ToArray ()); private static readonly HashSet & lt; string & gt; ЗапрещеноNames = new HashSet & lt; string & gt; {@ "aux", @ "con", @ "clock $", @ "nul", @ "prn", @ "com1", @ "com2", @ "com3", @ "com4", @ "com5 ", @" com6 ", @" com7 ", @" com8 ", @" com9 ", @" lpt1 ", @" lpt2 ", @" lpt3 ", @" lpt4 ", @" lpt5 ", @" lpt6 ", @" lpt7 ", @" lpt8 ", @" lpt9 "}; public static bool IsValidFileName (string fileName) {return! string.IsNullOrWhiteSpace (fileName) & amp; & amp; & amp; & amp; & amp; & amp; & amp; & amp; fileName.All (o = & gt;! IsInvalidFileNameChar (o)) & amp; & amp; & amp; ! IsProhibitedName (Filename); } public static bool IsProhibitedName (string fileName) {return Запрещенные имена.Contains (fileName.ToLower (CultureInfo.InvariantCulture)); } private static string ReplaceInvalidFileNameSymbols ([CanBeNull] это строковое значение, string replacementValue) {if (value == null) {return null; } return InvalidFileNameChars.Value.Aggregate (новый StringBuilder (значение), (sb, currentChar) = & gt; sb.Replace (currentChar, replacementValue)). ToString (); } public static bool IsInvalidFileNameChar (значение char) {return InvalidFileNameChars.Value.Contains (значение.ToString (CultureInfo.InvariantCulture)); } public static string GetValidFileName ([NotNull] это строковое значение) {return GetValidFileName (значение, @ "_"); } public static string GetValidFileName ([NotNull] это строковое значение, string replacementValue) {if (string.IsNullOrWhiteSpace (значение)) {throw new ArgumentException (значение @ должно быть не пустым), nameof (value)); } if (IsProhibitedName (значение)) {return (string.IsNullOrWhiteSpace (replacementValue)? @ "_": replacementValue) + значение; } return ReplaceInvalidFileNameSymbols (value, replacementValue); } public static string GetFileNameError (string fileName) {if (string.IsNullOrWhiteSpace (имя_файла)) {return CommonResources.SelectReportNameError; } if (IsProhibitedName (имя_файла)) {return CommonResources.FileNameIsProhibited; } var invalidChars = fileName.Where (IsInvalidFileNameChar) .Distinct (). ToArray (); if (invalidChars.Length & gt; 0) {return string.Format (CultureInfo.CurrentCulture, invalidChars.Length == 1? CommonResources.InvalidCharacter: CommonResources.InvalidCharacters, StringExtensions.JoinQuoted (@ ",", @ "'", invalidChars. Выберите (c = & gt; c.ToString (CultureInfo.CurrentCulture)))); } return string.Empty; }}
Метод GetValidFileName
заменяет все неверные данные на _
.
>>> s="aaa?aaa"
>>> import re
>>> re.findall(r'aaa\?aaa', s)
['aaa?aaa']
Причина /aaa?aaa
не будет совпадать внутри вашего URL-адреса, потому что ?
начинает новый запрос GET.
Итак, соответствующая часть URL-адреса только до первой «aaa». Остальная '? Aaa' представляет собой новую строку запроса , разделенную '?' mark, содержащий переменную «aaa», передаваемую как параметр GET.
То, что вы можете сделать здесь, кодирует переменную, прежде чем она попадает в URL-адрес. Закодированная форма ?
- %3F
.
Вы также не должны совпадать с запросом GET, например /?code=authenticationcode
, с использованием регулярного выражения. Вместо этого, сопоставьте свой URL с /
с помощью r'^$'
. Django передаст переменную code
в качестве параметра GET для объекта request
, который вы можете получить в своем представлении, используя request.GET.get('code')
.
Django's urls.py
не анализирует строки запроса, поэтому нет способа получить эту информацию в файле urls.py
.
Вместо этого проанализируйте его в своем представлении:
def foo(request):
code = request.GET.get('code')
if code:
# do stuff
else:
# No code!
«Как сопоставить«? », это особенное?» Да, но вы экономите его, используя обратную косую черту. Тем не менее, я не вижу, где вы учитывали ведущую косую черту. Этот бит просто нужно добавить в:
r'^/\?code=(?P<code>.*)$'
подавляет метасимволы регулярных выражений с помощью []
>>> s
'/?code=authenticationcode'
>>> r=re.compile(r'^/[?]code=(.+)')
>>> m=r.match(s)
>>> m.groups()
('authenticationcode',)
[^?$]
? Побег будет лучшим подходом.
– Kenneth K.
7 October 2012 в 09:14
Вы не можете использовать ?
в URL как значение переменной. ?
указывает, что есть переменные.
Нравится: http://www.example.com?variable=1&another_variable=2
Заменить его или сбежать. Вот небольшая документация .