firebase auth error Response to preflight [duplicate]

Я собираюсь продемонстрировать альтернативную структуру, чтобы передать значение списка по умолчанию функции (она одинаково хорошо работает со словарями).

Поскольку другие подробно комментируют, параметр списка привязан к функции, когда она определена, а не когда она выполняется. Поскольку списки и словари изменяемы, любое изменение этого параметра влияет на другие вызовы этой функции. В результате последующие вызовы функции получат этот общий список, который может быть изменен любыми другими вызовами функции. Хуже того, два параметра используют общий параметр этой функции, в то же время не обращая внимания на изменения, сделанные другим.

Неверный метод (возможно ...):

def foo(list_arg=[5]):
    return list_arg

a = foo()
a.append(6)
>>> a
[5, 6]

b = foo()
b.append(7)
# The value of 6 appended to variable 'a' is now part of the list held by 'b'.
>>> b
[5, 6, 7]  

# Although 'a' is expecting to receive 6 (the last element it appended to the list),
# it actually receives the last element appended to the shared list.
# It thus receives the value 7 previously appended by 'b'.
>>> a.pop()             
7

Вы можете убедиться, что это один и тот же объект, используя id:

>>> id(a)
5347866528

>>> id(b)
5347866528

Per Brett Slatkin's «Эффективный Python: 59 конкретных способов записи лучшего Python», Пункт 20: Использование None и Docstrings для указания динамических аргументов по умолчанию (стр. 48)

Соглашение о достижении желаемого результата в Python заключается в предоставлении значения по умолчанию None и документируйте фактическое поведение в docstring.

Эта реализация гарантирует, что каждый вызов функции либо получает список по умолчанию, либо список, переданный функции.

Предпочтительный Метод:

def foo(list_arg=None):
   """
   :param list_arg:  A list of input values. 
                     If none provided, used a list with a default value of 5.
   """
   if not list_arg:
       list_arg = [5]
   return list_arg

a = foo()
a.append(6)
>>> a
[5, 6]

b = foo()
b.append(7)
>>> b
[5, 7]

c = foo([10])
c.append(11)
>>> c
[10, 11]

В «Неправильном методе» могут быть законные варианты использования, в соответствии с которыми программист предполагает, что параметр списка по умолчанию должен быть общим, но это скорее исключение, чем правило.

162
задан Dimitre Novatchev 10 December 2011 в 20:10
поделиться

5 ответов

Origin null - это локальная файловая система, поэтому вы предполагаете, что загружаете страницу HTML, которая выполняет вызов load через URL file:/// (например, просто дважды щелкнув его в локальном файловом браузере или похожие). Различные браузеры применяют разные подходы к применению Same Origin Policy к локальным файлам.

Предполагаю, что вы видите это с помощью Chrome. Правила Chrome для применения SOP к локальным файлам очень жесткие, он запрещает даже загрузку файлов из того же каталога, что и документ. Так же и Opera. Некоторые другие браузеры, такие как Firefox, допускают ограниченный доступ к локальным файлам. Но в основном, использование ajax с локальными ресурсами не будет работать в кросс-браузере.

Если вы просто проверяете что-то локально, что вы действительно будете развертывать в Интернете, а не использовать локальные файлы, установите простой веб-сервер и протестируйте его через http:// URL. Это дает вам более точную картину безопасности.

210
ответ дан T.J. Crowder 21 August 2018 в 03:21
поделиться
  • 1
    После того, как я загружу его, я больше не получаю Origin null, но я все еще получаю и не разрешаю Access-Control-Allow-Origin. & Quot; – dudledok 11 December 2011 в 14:15
  • 2
    Если ресурс, который вы загружаете, как вы показали ($('#result').load('weather.xsl');), этого не должно произойти, потому что запрос явно имеет то же самое происхождение. Если вы пытаетесь загрузить из другого места (например, $('#result').load('http://somewhere.else/weather.xsl');), вы снова запускаете SOP, но по-другому. Запросы Ajax ограничены одним и тем же происхождением (см. Ссылку в ответе), или если вы используете браузер CORS , и сервер поддерживает COR, сервер может выбрать разрешить ли запрос кросс-происхождения. – T.J. Crowder 11 December 2011 в 14:20
  • 3
    Я изменил URL-адрес загрузки. Изменение его обратно на тот, что в вопросе, делает его нагрузкой штраф. Спасибо за помощь – dudledok 11 December 2011 в 16:28
  • 4
    Каков самый простой и быстрый способ настроить простой веб-сервер? Будет ли IIS самым простым способом здесь? – Ciaran Gallagher 23 February 2013 в 18:29
  • 5
    @CiaranG Я побежал python -m SimpleHTTPServer из командной строки, а затем отправился на localhost: 8000, работал для меня. Python поставляется с предустановленной Mac OS X; вам может потребоваться установить, если вы используете другую ОС. – Dave Liepmann 25 July 2013 в 23:11

Я хотел бы смиренно добавить, что в соответствии с этим SO-источником: https://stackoverflow.com/a/14671362/1743693 эта проблема теперь частично решена просто путем использования следующих Инструкция jQuery:

<script> 
    $.support.cors = true;
</script>

Я попробовал это на IE10.0.9200, и он сработал немедленно (используя jquery-1.9.0.js).

На chrome 28.0.1500.95 - это инструкция не работает (это происходит повсюду, поскольку david жалуется на комментарии по ссылке выше)

Запуск chrome с -allow-file-access-from-files сделал не работает для меня (как заявлял Майстора выше)

2
ответ дан Community 21 August 2018 в 03:21
поделиться

У Chrome и Safari есть ограничение на использование ajax с локальными ресурсами. Вот почему это бросает ошибку, например

Происхождение null не разрешено Access-Control-Allow-Origin.

Решение : Используйте firefox или загрузите данные на временный сервер. Если вы все еще хотите использовать Chrome, запустите его с помощью следующей опции:

--allow-file-access-from-files

Подробнее о том, как добавить указанный выше параметр в свой Chrome: щелкните правой кнопкой мыши значок Chrome на панели задач, щелкните правой кнопкой мыши Google Chrome во всплывающем окне и щелкните свойства и добавьте вышеуказанный параметр в текстовое поле «Цель» на вкладке «Ярлык». Это будет как показано ниже:

C:\Users\XXX_USER\AppData\Local\Google\Chrome\Application\chrome.exe --allow-file-access-from-files

Надеюсь, это поможет!

207
ответ дан Gokhan Tank 21 August 2018 в 03:21
поделиться
  • 1
    +1 для предоставления более простого решения, чем «запуск веб-сервера». – RoundTower 30 December 2012 в 02:15
  • 2
    В Mac OS X вы можете запустить Chrome с помощью этой опции, открыв терминал и набрав: /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --allow-file-access-from-files & Обратите внимание на окончательный & amp; так что вы можете продолжать использовать терминал и не требуется. ПРИМЕЧАНИЕ: Если вы закроете терминал, он закроет окно Chrome. – Bruno Bernardino 3 February 2013 в 15:10
  • 3
    Мне понравилось предложение, но это не помогло мне. – nyxz 20 February 2013 в 12:44
  • 4
    Все это и закрыл и открыл. все еще нет выхода (Chrome 27.0.1453.116 м на XP) – mplungjan 25 June 2013 в 10:14
  • 5
    Я не могу добавить этот параметр под Windows 8 ..., кто-нибудь, кто знает, как это сделать? ... – Ariel Altamirano 22 May 2014 в 21:32

Просто хотелось добавить, что ответ «запустить веб-сервер» кажется довольно сложным, но если у вас есть python на вашей системе (установлен по умолчанию, по крайней мере, на MacOS и любой дистрибутив Linux), это так же просто, как:

python -m http.server  # with python3

или

python -m SimpleHTTPServer  # with python2

Итак, если у вас есть html-файл myfile.html в папке, скажем mydir, все, что вам нужно сделать, это:

cd /path/to/mydir
python -m http.server  # or the python2 alternative above

Затем укажите браузеру:

http://localhost:8000/myfile.html

И все готово! Работает во всех браузерах без отключения веб-безопасности, разрешения локальных файлов или даже перезапуска браузера с параметрами командной строки.

36
ответ дан gozzilli 21 August 2018 в 03:21
поделиться

Добавление бит для использования решения Gokhan для использования:

--allow-file-access-from-files

Теперь вам просто нужно добавить над текстом текст цели, а затем пробел. убедитесь, что вы закрыли все экземпляры браузера Chrome после добавления свойства выше. Теперь перезапустите хром с помощью значка, где вы добавили это свойство. Он должен работать для всех.

2
ответ дан saurabh 21 August 2018 в 03:21
поделиться
  • 1
    Параметр уже был представлен Ghokan Tank и выяснение того, как всегда использовать браузер с этим параметром, не является частью вопроса. Кроме того, вы не можете предположить, что все используют Microsoft Windows. – jnns 21 November 2013 в 01:01
  • 2
    – Tamás Bolvári 25 January 2016 в 17:08
Другие вопросы по тегам:

Похожие вопросы: