HTML-видео не работает, когда шаблон отображается в Flask [duplicate]

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

326
задан hughdbrown 18 December 2013 в 01:31
поделиться

13 ответов

Предпочтительным методом является использование nginx или другого веб-сервера для обслуживания статических файлов; они смогут сделать это более эффективно, чем Flask.

Однако вы можете использовать send_from_directory для отправки файлов из каталога, что может быть довольно удобным в некоторых ситуациях :

from flask import Flask, request, send_from_directory

# set the project root directory as the static folder, you can set others.
app = Flask(__name__, static_url_path='')

@app.route('/js/<path:path>')
def send_js(path):
    return send_from_directory('js', path)

if __name__ == "__main__":
    app.run()

Не используйте send_file или send_static_file с заданным пользователем способом.

send_static_file пример:

from flask import Flask, request
# set the project root directory as the static folder, you can set others.
app = Flask(__name__, static_url_path='')

@app.route('/')
def root():
    return app.send_static_file('index.html')
415
ответ дан atupal 17 August 2018 в 22:15
поделиться
  • 1
    для поддержки Windows: return app.send_static_file (os.path.join ('js', path) .replace ('\\', '/')) – Tony BenBrahim 30 March 2014 в 09:56
  • 2
    может ли злоумышленник использовать этот метод для просмотра исходных файлов фляг, просматривая вид / js / & gt; некоторая умная кодировка «../ yourflaskapp.py» & gt; ? – akiva 5 May 2014 в 17:54
  • 3
    @kiwi send_from_directory предназначен для решения этой проблемы безопасности. Он существует для ошибки, если путь ведет за пределы конкретного каталога. – jpmc26 5 May 2014 в 21:59
  • 4
    "Не использовать файл send_file или send_static_file с предоставленным пользователем способом. & quot; почему нет? – Drew Verlee 8 April 2015 в 15:29
  • 5
    – EpicPandaForce 8 April 2015 в 20:48
  • 6
    @DenisV не имеет ничего общего с Python per se, это соглашение Flask для определения параметров URL (см. http://flask.pocoo.org/docs/0.12/api/#url-route-registrations ). В двух словах <path> эквивалентно <string:path>, а потому, что вы хотите, чтобы Flask обеспечивал путь, подобный параметру, который вы запрашиваете для <path:path>. – b4stien 26 March 2017 в 18:40

Я уверен, что вы найдете то, что вам нужно: http://flask.pocoo.org/docs/quickstart/#static-files

В принципе вы просто нужна «статическая» папка в корне вашего пакета, а затем вы можете использовать url_for('static', filename='foo.bar') или напрямую ссылаться на ваши файлы с помощью http://example.com/static/foo.bar .

EDIT: Как было предложено в комментариях, вы можете напрямую использовать путь '/static/foo.bar' URL-адреса, но накладные расходы url_for() довольно низки, а его использование означает, что вы сможете легко настроить поведение после этого (изменение папки, изменение пути URL, перенос ваших статических файлов на S3 и т. д.).

64
ответ дан b4stien 17 August 2018 в 22:15
поделиться
  • 1
    Почему бы не '/static/foo.bar' напрямую? – Tyler Long 19 September 2014 в 10:26
  • 2
    @TylerLong прав - если вы хотите связать файл, который уже сохранен в вашем статическом каталоге, вы можете напрямую связать его с ним без какого-либо кода маршрута. – hamx0r 23 December 2014 в 02:19
  • 3
    @TylerLong - отредактирован, чтобы включить ваши предложения. – b4stien 27 December 2014 в 11:53

Если вы просто пытаетесь открыть файл, вы можете использовать app.open_resource(). Поэтому чтение файла будет выглядеть примерно как

with app.open_resource('/static/path/yourfile'):
      #code to read the file and do something
0
ответ дан Chaitanya Shivade 17 August 2018 в 22:15
поделиться

Простейший рабочий пример, основанный на других ответах, следующий:

from flask import Flask, request
app = Flask(__name__, static_url_path='')

@app.route('/index/')
def root():
    return app.send_static_file('index.html')

if __name__ == '__main__':
  app.run(debug=True)

С HTML под названием index.html :

<!DOCTYPE html>
<html>
<head>
    <title>Hello World!</title>
</head>
<body>
    <div>
         <p>
            This is a test.
         </p>
    </div>
</body>
</html>

ВАЖНО: И index.html находится в папке static, то есть <projectpath> имеет файл .py, а <projectpath>\static имеет файл html.

Если вы хотите, чтобы сервер был видимым в сети, используйте app.run(debug=True, host='0.0.0.0')

EDIT: для отображения всех файлов в папке, если требуется, используйте этот параметр

@app.route('/<path:path>')
def static_file(path):
    return app.send_static_file(path)

. Это по существу BlackMamba, так что дайте им преимущество.

29
ответ дан EpicPandaForce 17 August 2018 в 22:15
поделиться

Вы можете использовать эту функцию:

send_static_file(filename) Функция, используемая для отправки статических файлов из статической папки в браузер.

app = Flask(__name__)
@app.route('/<path:path>')
def static_file(path):
    return app.send_static_file(path)
30
ответ дан Filipp W. 17 August 2018 в 22:15
поделиться
  • 1
    Это был единственный, который работал для меня без большой головной боли. – Kenny Powers 22 March 2016 в 02:24
  • 2
    Одна и та же. Где я понимаю, Flash сильно зависит от идеи, что мы собираемся использовать свою систему шаблонов, а не RIA, где HTML создается в другом месте. – NiKo 5 October 2017 в 11:54
  • 3
    ПРЕДУПРЕЖДЕНИЕ. Это серьезная проблема безопасности для вызова send_static_file с пользовательским вводом. Не используйте это решение ни в чем важном. – xApple 2 August 2018 в 06:12
from flask import redirect, url_for
...
@app.route('/', methods=['GET'])
def metrics():
    return redirect(url_for('static', filename='jenkins_analytics.html'))

В этом файле хранятся все файлы (css & amp; js ...), указанные в вашем html-файле.

2
ответ дан ForzaGreen 17 August 2018 в 22:15
поделиться

& nbsp; & nbsp; & nbsp; По умолчанию флажок использует папку «шаблоны», чтобы содержать все ваши файлы шаблонов (любой текстовый файл, но обычно .html или какой-то язык шаблонов, такой как jinja2) & amp; «статическая» папка, содержащая все ваши статические файлы (т. е. .js .css и ваши изображения). & nbsp; & nbsp; & nbsp; В вашем routes вы можете использовать render_template() для рендеринга файла шаблона (как я сказал выше, по умолчанию он помещается в папку templates) в качестве ответа для вашего запроса. И в файле шаблона (обычно это файл в формате .html), вы можете использовать некоторые файлы .js и / или `.css ', поэтому, я думаю, ваш вопрос заключается в том, как увязать эти статические файлы с текущим файлом шаблона.

0
ответ дан Harvey 17 August 2018 в 22:15
поделиться

То, что я использую (и отлично работает), является каталогом «шаблонов» и «статическим» каталогом. Я размещаю все мои .html файлы / флеш-шаблоны внутри каталога шаблонов, а static содержит CSS / JS. render_template отлично работает для общих html-файлов, насколько мне известно, независимо от того, насколько вы использовали синтаксис шаблонов Flask. Ниже приведен пример запроса в файле views.py.

@app.route('/projects')
def projects():
    return render_template("projects.html", title = 'Projects')

Просто убедитесь, что вы используете url_for (), когда хотите ссылаться на некоторый статический файл в отдельном статическом каталоге. Вероятно, вы в конечном итоге все это сделаете в своих ссылках на файлы CSS / JS в html. Например ...

<script src="{{ url_for('static', filename='styles/dist/js/bootstrap.js') }}"></script>

Вот ссылка на «каноническое» неофициальное учебное пособие по фляге - множество полезных советов здесь, чтобы помочь вам попасть в землю.

http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world

31
ответ дан Kyle Sum 17 August 2018 в 22:15
поделиться

Итак, у меня все работает (на основе ответа @ user1671599) и хочу поделиться им с вами, ребята.

(Надеюсь, что я делаю это правильно, так как это мое первое приложение на Python)

Я сделал это -

Структура проекта:

enter image description here [/g0]

server.py:

from server.AppStarter import AppStarter
import os

static_folder_root = os.path.join(os.path.dirname(os.path.abspath(__file__)), "client")

app = AppStarter()
app.register_routes_to_resources(static_folder_root)
app.run(__name__)

AppStarter.py:

from flask import Flask, send_from_directory
from flask_restful import Api, Resource
from server.ApiResources.TodoList import TodoList
from server.ApiResources.Todo import Todo


class AppStarter(Resource):
    def __init__(self):
        self._static_files_root_folder_path = ''  # Default is current folder
        self._app = Flask(__name__)  # , static_folder='client', static_url_path='')
        self._api = Api(self._app)

    def _register_static_server(self, static_files_root_folder_path):
        self._static_files_root_folder_path = static_files_root_folder_path
        self._app.add_url_rule('/<path:file_relative_path_to_root>', 'serve_page', self._serve_page, methods=['GET'])
        self._app.add_url_rule('/', 'index', self._goto_index, methods=['GET'])

    def register_routes_to_resources(self, static_files_root_folder_path):

        self._register_static_server(static_files_root_folder_path)
        self._api.add_resource(TodoList, '/todos')
        self._api.add_resource(Todo, '/todos/<todo_id>')

    def _goto_index(self):
        return self._serve_page("index.html")

    def _serve_page(self, file_relative_path_to_root):
        return send_from_directory(self._static_files_root_folder_path, file_relative_path_to_root)

    def run(self, module_name):
        if module_name == '__main__':
            self._app.run(debug=True)
5
ответ дан petezurich 17 August 2018 в 22:15
поделиться

Если вы просто хотите переместить местоположение ваших статических файлов, то самый простой способ - объявить пути в конструкторе. В приведенном ниже примере я переместил свои шаблоны и статические файлы в подпапку с именем web.

app = Flask(__name__,
            static_url_path='', 
            static_folder='web/static',
            template_folder='web/templates')
  • static_url_path='' удаляет любой предыдущий путь из URL (т. Е. По умолчанию /static).
  • static_folder='web/static' сообщит, что Flask обслуживает файлы, найденные в web/static.
  • template_folder='web/templates', аналогично, это изменяет папку шаблонов.

Используя этот метод, следующий URL-адрес вернет CSS-файл:

<link rel="stylesheet" type="text/css" href="/css/bootstrap.min.css">

И, наконец, вот фрагмент структуры папок, где flask_server.py - это экземпляр Flask:

19
ответ дан Richard Dunn 17 August 2018 в 22:15
поделиться
  • 1
    Большое спасибо, что вы спасете мою жизнь. удачи, что ты делаешь – user 5 September 2017 в 10:21
  • 2
    это очень приятно, спасибо – Espoir Murhabazi 28 June 2018 в 14:15
  • 3
    Это то, что сработало и для меня. Send_from_directory просто не работал, несмотря на все рекомендации для него. – G.A. 24 July 2018 в 20:09

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

app = Flask(__name__, static_url_path='/static')

С помощью этого набора вы можете использовать стандартный HTML:

<link rel="stylesheet" type="text/css" href="/static/style.css">
54
ответ дан sharpshadow 17 August 2018 в 22:15
поделиться
  • 1
    это не работает помощник. – Volatil3 7 November 2014 в 11:06
  • 2
    Хорошо работает, если имеется файл project/static/style.css. – Pavel Vlasov 17 January 2018 в 17:05
  • 3
    строка "app = Flask (....)" "статический_каталог" быть параметром слишком – datdinhquoc 5 June 2018 в 07:01

Для углового + шаблонного потока, который создает следующее дерево папок:

backend/
|
|------ui/
|      |------------------build/          <--'static' folder, constructed by Grunt
|      |--<proj           |----vendors/   <-- angular.js and others here
|      |--     folders>   |----src/       <-- your js
|                         |----index.html <-- your SPA entrypoint 
|------<proj
|------     folders>
|
|------view.py  <-- Flask app here

Я использую следующее решение:

...
root = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ui", "build")

@app.route('/<path:path>', methods=['GET'])
def static_proxy(path):
    return send_from_directory(root, path)


@app.route('/', methods=['GET'])
def redirect_to_index():
    return send_from_directory(root, 'index.html')
...

Он помогает переопределить «статическую» папку в пользовательскую.

5
ответ дан user1671599 17 August 2018 в 22:15
поделиться
0
ответ дан Jeevan Chaitanya 29 October 2018 в 20:35
поделиться
Другие вопросы по тегам:

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