Получение правильного пути к файлам stati c для их обслуживания через nginx - PullRequest
2 голосов
/ 28 мая 2020

Мне сложно понять, как обслуживать файлы статистики c для моего Flask веб-приложения через Nginx и Gunicorn. Вся документация, которую я видел в Интернете, указывает на добавление некоторого пути к псевдониму папки stati c, когда клиент делает запрос на файлы stati c. Однако я не уверен, каким должен быть полный путь, поскольку приложение размещено на Heroku. Все запросы к файлам stati c возвращают ошибку 404. Я также заметил, что запрос XHR к файлу JSON, хранящемуся в каталоге /static/json/<file>.json, не возвращает объект JSON в случае успеха.

Иерархия проекта:

project/
|_ config/
   |_ gunicorn.conf.py
   |_ nginx.conf.erb
|_ flask_app/
   |_ __init__.py
   |_ static/
      |_ css/
      |_ js/
      |_ images/
      |_ json/
|_ Procfile
|_ run.py

проект / config / gunicorn.conf.py:

def when_ready(server):
    open('/tmp/app-initialized', 'w').close()

bind = 'unix:///tmp/nginx.socket'

проект / config / nginx .conf.erb:

daemon off;
#Heroku dynos have at least 4 cores.
worker_processes <%= ENV['NGINX_WORKERS'] || 4 %>;

events {
    use epoll;
    accept_mutex on;
    worker_connections <%= ENV['NGINX_WORKER_CONNECTIONS'] || 1024 %>;
}

http {
    server_tokens off;

    log_format l2met 'measure#nginx.service=$request_time request_id=$http_x_request_id';
    access_log <%= ENV['NGINX_ACCESS_LOG_PATH'] || 'logs/nginx/access.log' %> l2met;
    error_log <%= ENV['NGINX_ERROR_LOG_PATH'] || 'logs/nginx/error.log' %>;

    include mime.types;
    default_type application/octet-stream;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;

    #Must read the body in 5 seconds.
    client_body_timeout 5;

    upstream app_server {
        server unix:/tmp/nginx.socket fail_timeout=0;
    }

    server {
        listen <%= ENV["PORT"] %>;
        server_name _;
        keepalive_timeout 5;

        # Configure NGINX to deliver static content from the specified folder
      location /static {
        alias /static;
      }

        location / {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_redirect off;
            proxy_pass http://app_server;
        }
    }
}

проект / Procfile

web: bin/start-nginx gunicorn -c config/gunicorn.conf.py 'run:create_app()'
worker: python worker.py
clock: python clock.py

пример. js

export function getData() {
  $.ajax({
    type: 'GET',
    url: '/static/json/data.json',
    async: false,
    success : function(data) {
      currentPageIndex = 0;
      numberOfPages = data.length; // Getting undefined error here on "data"
    }
  });
}

Ответы [ 3 ]

0 голосов
/ 11 июня 2020

используйте код python для рендеринга файлов

@app.route("/")
def main():
    return render_template('main.html')

examples / flask / stat / templates / main. html

если вы используете stati c изображения используют относительный путь

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport"
     content="width=device-width, initial-scale=1, user-scalable=yes">

  <link href="/static/css/style.css" rel="stylesheet">
</head>
<body>
<h1>Hello World</h1>

<img src="static/img/code_maven_128.png" />

</body>
</html>

The CSS itself is also very simple, its content is not relevant for our purposes.

examples/flask/stat/static/css/style.css

h1 {цвет: синий; } Как запустить это Есть два простых способа запустить это в developlent. Для обоих вам нужно открыть свой терминал (окно cmd, если вы находитесь на Windows), перейти в каталог, в котором можно найти файл приложения (web.py в нашем случае).

python web .py Лучший способ, который обеспечивает больший контроль над тем, как это запускать, - использовать:

https://code-maven.com/flask-serve-static-files

enter code here
0 голосов
/ 11 июня 2020

Я обнаружил, что проблема связана с неправильным путем к псевдониму. Сначала это было трудно определить, поскольку в Heroku каталог root настроен иначе, чем у меня на моей локальной машине. Каталог root для приложения Heroku - /app, поэтому я изменил псевдоним на этот, основываясь на иерархии моего проекта. Это должно сработать для всех, кто сталкивается с подобными проблемами.

location /static {
   alias /app/flask_app/static;
}
0 голосов
/ 10 июня 2020

В вашей конфигурации есть (как минимум) два способа размещения содержимого c stati. Мне неясно, какую из двух альтернатив, представленных ниже, вы выбрали - у меня сложилось впечатление, что вы хотите как-то получить обе?

  1. Я уверен, что вы читали https://flask.palletsprojects.com/en/1.1.x/tutorial/static/, в котором говорится, что

    Flask автоматически добавляет вид stati c, который принимает путь относительно каталога flaskr/static и обслуживает его.

    URL будет таким же, как и для вашего flask SPA с дополнительным static сзади, см., Например, Ссылка на Flask stati c файлы с url_for или https://flask.palletsprojects.com/en/1.1.x/quickstart/#url -building

    Расположение файла для содержимого c stati будет /static в вашем flask -app-каталоге.

  2. Обратите внимание: Как обслуживать файлы c в Flask, где указано

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

    В этом случае документ Nginx на Serving Stati c Content - ваш друг:

    URL будет просто www.example.com/whateverHerokuPutsHere/static.

    Местоположение файла может быть любым, что вы укажете в своем nginx.conf, обычно это поместите туда абсолютные пути.

    Отказ от ответственности: Я никогда не работал с heroku , поэтому я не уверен, будет ли whateverHerokuPutsHere. Вполне может быть, что это просто example.com, как вы настраиваете где-то в пользовательском интерфейсе Heroku. Для расположения файла я нашел блог Nginx как stati c сервер сайта на Heroku .

...