В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.
При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.
Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».
Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this
. Возьмем этот пример:
public class Some {
private int id;
public int getId(){
return this.id;
}
public setId( int newId ) {
this.id = newId;
}
}
И в другом месте вашего кода:
Some reference = new Some(); // Point to a new object of type Some()
Some otherReference = null; // Initiallly this points to NULL
reference.setId( 1 ); // Execute setId method, now private var id is 1
System.out.println( reference.getId() ); // Prints 1 to the console
otherReference = reference // Now they both point to the only object.
reference = null; // "reference" now point to null.
// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );
// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...
Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference
и otherReference
оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.
Предпочтительным методом является использование 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')
Я уверен, что вы найдете то, что вам нужно: 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 и т. д.).
Если вы просто пытаетесь открыть файл, вы можете использовать app.open_resource()
. Поэтому чтение файла будет выглядеть примерно как
with app.open_resource('/static/path/yourfile'):
#code to read the file and do something
Простейший рабочий пример, основанный на других ответах, следующий:
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
, так что дайте им преимущество.
Вы можете использовать эту функцию:
blockquote>
send_static_file(filename)
Функция, используемая для отправки статических файлов из статической папки в браузер.app = Flask(__name__) @app.route('/<path:path>') def static_file(path): return app.send_static_file(path)
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-файле.
& nbsp; & nbsp; & nbsp; По умолчанию флажок использует папку «шаблоны», чтобы содержать все ваши файлы шаблонов (любой текстовый файл, но обычно .html
или какой-то язык шаблонов, такой как jinja2) & amp; «статическая» папка, содержащая все ваши статические файлы (т. е. .js
.css
и ваши изображения). & nbsp; & nbsp; & nbsp; В вашем routes
вы можете использовать render_template()
для рендеринга файла шаблона (как я сказал выше, по умолчанию он помещается в папку templates
) в качестве ответа для вашего запроса. И в файле шаблона (обычно это файл в формате .html), вы можете использовать некоторые файлы .js
и / или `.css ', поэтому, я думаю, ваш вопрос заключается в том, как увязать эти статические файлы с текущим файлом шаблона.
То, что я использую (и отлично работает), является каталогом «шаблонов» и «статическим» каталогом. Я размещаю все мои .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
Итак, у меня все работает (на основе ответа @ user1671599) и хочу поделиться им с вами, ребята.
(Надеюсь, что я делаю это правильно, так как это мое первое приложение на Python)
Я сделал это -
Структура проекта:
[/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)
Если вы просто хотите переместить местоположение ваших статических файлов, то самый простой способ - объявить пути в конструкторе. В приведенном ниже примере я переместил свои шаблоны и статические файлы в подпапку с именем 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:
Вы также можете, и это мой любимый, установить папку как статический путь, чтобы файлы внутри были доступны для всех.
app = Flask(__name__, static_url_path='/static')
С помощью этого набора вы можете использовать стандартный HTML:
<link rel="stylesheet" type="text/css" href="/static/style.css">
Для углового + шаблонного потока, который создает следующее дерево папок:
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')
...
Он помогает переопределить «статическую» папку в пользовательскую.
send_from_directory
предназначен для решения этой проблемы безопасности. Он существует для ошибки, если путь ведет за пределы конкретного каталога. – jpmc26 5 May 2014 в 21:59<path>
эквивалентно<string:path>
, а потому, что вы хотите, чтобы Flask обеспечивал путь, подобный параметру, который вы запрашиваете для<path:path>
. – b4stien 26 March 2017 в 18:40