Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Web
  • » Flask Просмотр локальной папки в браузере, работа с файлами [RSS Feed]

#1 Авг. 17, 2017 13:01:28

gmaksim
От: Россия
Зарегистрирован: 2017-07-17
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Flask Просмотр локальной папки в браузере, работа с файлами

Пытаюсь сделать небольшой просмотрщик файлов и папок (с возможностью удаления, скачивания, загрузки, навигации по папкам) работающий в веб-браузере. Судя по всему при использовании Python, для этих целей более всего подходит Flask.
Удалось путем чтения туториалов и стековерфлоу реализовать следующее (загрузка файлов и просмотр папки, куда все загружается):

 import os
from flask import request, redirect, url_for, render_template, abort, send_file
from werkzeug.utils import secure_filename
from app import app
@app.route('/')
@app.route('/index/')
def index():
    path = os.path.expanduser('static')
    return render_template('index.html', tree=make_tree(path))
def make_tree(path):
    tree = dict(name=path, children=[])
    try: lst = os.listdir(path)
    except OSError: pass
    else:
        for name in lst:
            fn = os.path.join(path, name)
            if os.path.isdir(fn):
                tree['children'].append(make_tree(fn))
            else:
                tree['children'].append(dict(name=fn))
    return tree
UPLOAD_FOLDER = 'static'
ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'])
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
def make_dirs():
    # os.mkdir('static')
    # os.mkdir('tmp')
    # os.mkdir('app')
    # os.mkdir('app/templates')
    # os.mkdir('app/static')
    pass
def allowed_file(filename):
    return '.' in filename and \
           filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
@app.route('//', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        if 'file' not in request.files:
            flash('No file part')
            return redirect(request.url)
        file = request.files['file']
        if file.filename == '':
            flash('No selected file')
            return redirect(request.url)
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            return redirect(url_for('index'))
    return
 <html>
  <head>
<title>Path: {{ tree.name }}</title>
<h1>{{ tree.name }}</h1>
  </head>
  <body>
       <form method=post enctype=multipart/form-data>
      <input type=file name=file>
         <input type=submit value=Upload>
    </form>
<ul>
{%- for item in tree.children recursive %}
    <li><a href="{{ item.name }}">{{ item.name }}</a>
    {%- if item.children -%}
      <ul><a href="/static/{{ (item.children) }}">{{ loop(item.children) }}</a></ul>
    {%- endif %}</li>
{%- endfor %}
</ul>
  </body>
</html>
Но минус в том, что выводится просто большой список всего, что есть в заданном основном каталоге, что не дает возможность навигации и тд и тп. Плюс не понятно как сделать возможность скачивания и всего остального в такой ситуации.
Возможно есть примеры схожих небольших проектов (находил похожее на github, но простыми и легкими их сложно назвать), как пример. Или какой-либо другой возможный путь реализации задумки.

Спасибо!

Отредактировано gmaksim (Авг. 17, 2017 13:03:20)

Офлайн

#2 Авг. 17, 2017 18:22:14

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Flask Просмотр локальной папки в браузере, работа с файлами

gmaksim
Судя по всему при использовании Python, для этих целей более всего подходит Flask.
интересное утверждение, как вы к нему пришли?
А я для подобного брал iohttp. А на заре использовал обычный BaseHttpServer или как там он во втором питоне назывался.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Авг. 17, 2017 19:37:17

gmaksim
От: Россия
Зарегистрирован: 2017-07-17
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Flask Просмотр локальной папки в браузере, работа с файлами

JOHN_16
интересное утверждение, как вы к нему пришли?
google.ru + ya.ru
JOHN_16
я для подобного брал iohttp.
JOHN_16
на заре использовал обычный BaseHttpServer
Первое не сталкивался, надо посмотреть.
Второе пробовал, но никак в толк не могу взять как это все вязать с HTTP, как-то слишком странно выглядит, честно говоря, неужели так делают?
Если у вас есть примеры кода (старого) или какой-либо реализации не на Flask/модной библиотеке, буду дичайше благодарен.

Офлайн

#4 Авг. 17, 2017 21:46:46

sander
Зарегистрирован: 2015-02-19
Сообщения: 317
Репутация: +  53  -
Профиль   Отправить e-mail  

Flask Просмотр локальной папки в браузере, работа с файлами

gmaksim
упрощенный вариант с навигацией

 @app.route("/<paht:path>")
def dir_viewer(path):
    entries = os.scandir(path)
    # тут нормальный шаблон с render_template
    return """{% for entry in entries %}
       {% if entry.is_file() %}
            <a href="{{ url_for("download_file", path=entry.path) }}">{{ entry.name }}</a>
        {% else %}
            <a href="{{ url_for("dir_viewer", path=entry.path) }}">{{ entry.name }}</a>
        {% endif %}
      {% endfor %}
       """
@app.route("/download/<path:path>")
def download_file(path):
    return send_file(path)
       

Отредактировано sander (Авг. 17, 2017 21:47:58)

Офлайн

#5 Авг. 18, 2017 10:15:37

gmaksim
От: Россия
Зарегистрирован: 2017-07-17
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Flask Просмотр локальной папки в браузере, работа с файлами

sander
Не удается воспользоваться, что-то не так в строчках

  <a href="{{ url_for("download_file", path=entry.path) }}">{{ entry.name }}</a>
 <a href="{{ url_for("dir_viewer", path=entry.path) }}">{{ entry.name }}</a>
Когда убираешь кавычки у названий функций, возникает новая ошибка:
ValueError: View function did not return a response
Попробую разобраться сейчас.

Еще кажется тут должно быть path:path:
 @app.route("/<paht:path>")
Или нет?

Отредактировано gmaksim (Авг. 18, 2017 10:16:36)

Офлайн

#6 Авг. 18, 2017 14:21:24

sander
Зарегистрирован: 2015-02-19
Сообщения: 317
Репутация: +  53  -
Профиль   Отправить e-mail  

Flask Просмотр локальной папки в браузере, работа с файлами

gmaksim
Не удается воспользоваться, что-то не так в строчках
если есть ошибка - кидай трейсбек.

gmaksim
Еще кажется тут должно быть path:path:
опечатка, да.

Офлайн

#7 Авг. 21, 2017 11:22:18

gmaksim
От: Россия
Зарегистрирован: 2017-07-17
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Flask Просмотр локальной папки в браузере, работа с файлами

Не получается все равно воспользоваться, что вы подразумевается под нормальным шаблоном с render_template?
Данный код судя по всему в действующий не включить? Переход на /download/ тут:

 @app.route("/download/<path:path>")
def download_file(path):
совсем не понимаю. Точнее сам download - это будет работать в виду перехода на url в адресной строке и дальше автоматически подставляться в зависимости от того, что мы выбрали?

Отредактировано gmaksim (Авг. 21, 2017 11:24:26)

Офлайн

#8 Авг. 21, 2017 11:52:33

sander
Зарегистрирован: 2015-02-19
Сообщения: 317
Репутация: +  53  -
Профиль   Отправить e-mail  

Flask Просмотр локальной папки в браузере, работа с файлами

gmaksim

gmaksim
Не получается все равно воспользоваться, что вы подразумевается под нормальным шаблоном с render_template?
файл с html шаблоном, который рендерится через вызов render_template
gmaksim
Точнее сам download - это будет работать в виду перехода на url в адресной строке и дальше автоматически подставляться в зависимости от того, что мы выбрали?
все что идет после “/download/” будет считаться путем к файлу

Офлайн

#9 Авг. 21, 2017 13:20:02

gmaksim
От: Россия
Зарегистрирован: 2017-07-17
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Flask Просмотр локальной папки в браузере, работа с файлами

sander
файл с html шаблоном, который рендерится через вызов render_template
Т.е. после включения части
 {% for entry in entries %}
       {% if entry.is_file() %}
            <a href="{{ url_for("download_file", path=entry.path) }}">{{ entry.name }}</a>
        {% else %}
            <a href="{{ url_for("dir_viewer", path=entry.path) }}">{{ entry.name }}</a>
        {% endif %}
      {% endfor %}
В html файл, на который ссылается вызов render_template должны в месте добавления этой части отображаться файлы?

Офлайн

#10 Авг. 21, 2017 15:23:05

sander
Зарегистрирован: 2015-02-19
Сообщения: 317
Репутация: +  53  -
Профиль   Отправить e-mail  

Flask Просмотр локальной папки в браузере, работа с файлами

gmaksim
да, если сделаешь

 render_template("<template name>.html", entries=entries)

Офлайн

  • Начало
  • » Web
  • » Flask Просмотр локальной папки в браузере, работа с файлами[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version