Ответы пользователя по тегу Flask
  • Как запретить сайту на Flask поднятый на Windows IIS иметь доступ к другим папкам?

    @89109983838
    А как вы "перелистать файлы, папки"?
    напишите пример!!!
    вдруг у мня тоже так можно.... :(
    Ответ написан
  • Flask-sqlalchemy как проверить\создать\обновить строки в базе данных?

    @89109983838 Автор вопроса
    Вот после подбора и разбора параметров и ситуаций - результат такой:
    (буду признателен если кто добавит в комментариях правки по оптимизации)
    есть у нас форма с полями на типа:
    <input name=domain type="text" value="{{ data.domain }}">
    <input name=name type="text" value="{{data.name}}">
    .......... и так далее..... вьюшка получилась универсальна - 
    можно хоть сотни input добавлять прямо в шаблоне, 
    главное чтоб имена были у всех разные


    теперь сама вьюшка проверяет наличие input - он существует в базе то обновляет его значение - если нет еще то создает с присланными параметрами.

    app.route('/setting/', methods=['GET', 'POST', 'DELETE'])
    def setting():
        if not session.get('logged_in'): # проверяем залогин ли usr
            abort(404)                        
        if request.method == 'DELETE':  # Если метод HTTP = DELETE удаляем настройки для группы setting
            db.session.query(Setting).filter_by(group='setting').delete() 
            db.session.commit()
            return render_template('setting.html')
        data = {} #создаем словарь - в нем собираем данные и отправляем обратно в форму (так как разложить data = db.session.query(Setting).all() в шаблоне без переборов у меня не хватило ума... :(  , а так по-моему проще )
        if request.method == 'POST':
            for i in request.form.keys(): # обрабатываем каждый input по отдельности
                u = db.session.query(Setting).filter_by(group='setting').filter_by(key=i).first()
                if u: # если существует обновляем значением из form
                    u.value = request.form[i]                 
                    data[i] = request.form[i] # добавляем в словарь
                else:
                    db.session.add(Setting(group='setting', key=i, value=request.form[i])) # в противном случае создаем новое поле в базе данных и добавляем обратно в словарь
                    data[i] = request.form[i]
            db.session.commit() # Записать изменения в Базу данных
            return render_template('root/setting.html', data=data)  # как видите словарь ушел обратно к темплею, в указном выше примере показано как словарь раскладывается....
        u = db.session.query(Setting).filter_by(group='setting').all()   # Ну а пи простом GET запросе выгружаем все записи по группе, создаем словарь и отправляем на рендринг
        for i in u:        
            data[i.key]=i.value
        return render_template('root/setting.html', data=data)


    В результате:
    надо мне добавить в базу строку для хранения настройки какого-нибудь модуля
    - я добавляю соответственно только в теплее очередной input в его группу
    - и он сразу работает!!!!!

    Кстати таблица выглядит в models.py так:
    class Setting(db.Model):
        id = db.Column(db.Integer,primary_key = True)
        group = db.Column(db.String(32), nullable=False, default = 'NONE', index = True)
        key = db.Column(db.String(32), nullable=False, default = 'NONE', index = True)
        value = db.Column(db.Text, index = True)
        
        def get_id(self):
            return self.id
            
        def __unicode__(self):
            return self.id
    Ответ написан
  • Flask-sqlalchemy вместо страниц An error occurred?

    @89109983838 Автор вопроса
    Вообщем настроил uwsgi на работу по 0.0.0.0:8000 (добавив protocol=http)
    В браузере как и раньше открываются страницы только те что генерируются без обращения в Базе данных!

    А страницы с образением к базе (по типу как примере выше) выдает
    Соединение было сброшено
    Во время загрузки страницы соединение с сервером было сброшено.


    ################################# РЕШЕНИЕ##############
    Ответ оказался вполне простым:
    uwsgi - запускается от "лица" www, а база данных создавалась от другого пользователя user!
    соответственно: Flask не имел прав работать с базой данных и глючил- отрубаясь от uwsgi, ну а на DEV сервере естественно все работало т.к. права там одинаковы скажем так!

    надо логирование прикрутить к этому месту может сплывет что!
    Ответ написан
  • Как настроить пути статический файлов в flask?

    @89109983838
    Возможно у меня была аналогичная проблема, только с редиректами
    вот посмотрите может поможет Flask-admin при редиректах меняет url как исправить?

    добавлю вот ман для настройки flask статики flask.pocoo.org/snippets/102
    app = Flask(__name__, static_folder='static')
    Ответ написан
  • Как выбрать поля из базы для создания меню сайта без ненужных столбцов в Flask-SQLAlchemy?

    @89109983838 Автор вопроса
    from sqlalchemy.orm import load_only
    
    @app.context_processor
    def menu():
        articles = Article.query.filter_by(onoff=1).options(load_only("name", "url", "num"))
        return dict(articles=articles)


    Попробовал так... сайт вроде как работает! :) - времени нет посмотреть из интерактивного режима что там конкретно выгружается... потом вернуть к этому вопросу, проверю, отпишусь...

    ################ добавлено спустя долгое время... #####################
    и так если в шаблоне выставить где нето {{ articles }} то в html на этом месте такая строка:
    SELECT article.url AS article_url, article.name AS article_name FROM article, article.num AS article_num WHERE article.onoff = :onoff_1

    если же в генерацию меню вместо текста ссылок выставить названия поля где хранится код статей
    {% for article in articles %}
            <li><a href="/{{ article.url }}/">{{ article.article }}</a></li>
    {% endfor %}

    то вместо названий громадный набор текстов (ну самих статей.....)

    а если еще так поступить то вообще АТАС! ;)
    {% for article in articles %}
            <li><a href="/{{ article.url }}/">{{ article.article|safe }}</a></li>
    {% endfor %}


    Так что вопрос остается открытым .......
    Ответ написан
  • Flask-admin при редиректах меняет url как исправить?

    @89109983838 Автор вопроса
    Ответ нашёл сам!
    И заключается он в том что маны читать внимательнее надо!!! :(

    но все же укажу и здесь
    У меня нет доступа к настройкам Apache поэтому вариант таков:

    Если изменить настройки Apache нельзя, например, хостинг не предоставляет такой возможности, то можно воспользоваться промежуточным приложением WSGI для удаления yourapplication.fcgi из URL.
    Настройте .htaccess:
    <IfModule mod_fcgid.c>
       AddHandler fcgid-script .fcgi
       <Files ~ (\.fcgi)>
           SetHandler fcgid-script
           Options +FollowSymLinks +ExecCGI
       </Files>
    </IfModule>
    
    <IfModule mod_rewrite.c>
       Options +FollowSymlinks
       RewriteEngine On
       RewriteBase /
       RewriteCond %{REQUEST_FILENAME} !-f
       RewriteRule ^(.*)$ cgi-bin/flask-wrapper.fcgi/$1 [QSA,L]
    </IfModule>

    Теперь настроим flask-wrapper.fcgi:
    #!/home/profel/python/bin/python
    # -*- coding: utf-8 -*-
    import sys, os
    reload(sys)
    sys.setdefaultencoding('utf8')
    
    sys.path.insert(0, ' /home/profel/site/')
    
    from flup.server.fcgi import WSGIServer
    from app import app
    
    class ScriptNameStripper(object):
       def __init__(self, app):
           self.app = app
    
       def __call__(self, environ, start_response):
           environ['SCRIPT_NAME'] = ''
           return self.app(environ, start_response)
    
    app = ScriptNameStripper(app)
    
    if __name__ == '__main__':
        WSGIServer(app).run()


    Кстати укажу на этот отрезок кода
    import sys, os
    reload(sys)
    sys.setdefaultencoding('utf8')

    С помощью его я решил проблему с выводом русских букв из файлов *.py (на хостинге и тестовом сервере .. windows).
    (по видимому консоль хостера, как и cmd не в UFT8. Для исправления недуга при старте приложения консоль перегружаем c установкой кодировки по умолчанию в UTF8. как то так.... )
    Ответ написан
  • Как "прикрутить" простую авторизацию к flask-admin?

    @89109983838 Автор вопроса
    проблема решена _ решение в самом низу поста! ;)))

    Попробовал реализовать! переправив код авторизации через базу данных на аккаунт из конфига.

    проверка проходит!
    далее при правельном акаунте выходит Traceback
    jinja2.exceptions.UndefinedError
    UndefinedError: 'form' is undefined


    File "..........\app\templates\admin\index.html", line 17, in block "body"
    ........

    17 {{ form.hidden_tag() if form.hidden_tag }} <----- на это ругается
    18 {% for f in form if f.type != 'CSRFTokenField' %}
    19
    .......

    Основной код по этой ситуации:
    # -*- coding: utf-8 -*-
    import os
    from flask import Flask, request, session, g, redirect, url_for, abort, render_template, flash
    from flask.ext.sqlalchemy import SQLAlchemy
    from wtforms import form, fields, validators
    from flask.ext import admin
    from flask.ext.admin.contrib import sqla
    from flask.ext.admin import helpers, expose
    
    
    
    # Create Flask application
    app = Flask(__name__)
    
    # Create dummy secrey key so we can use sessions
    app.config['CSRF_ENABLED'] = True
    app.config['SECRET_KEY'] = '12345678290244'
    #app.config['DEBUG'] = 'True'
    app.config['USERNAME'] = 'admin'
    app.config['PASSWORD'] = '1234'
    
    
    # Create in-memory database (база для примера, для авторизации не используется)
    app.config['DATABASE_FILE'] = 'db.sqlite'
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + app.config['DATABASE_FILE']
    app.config['SQLALCHEMY_ECHO'] = True
    db = SQLAlchemy(app)
    
    
    # Create user model (модель для примера, для авторизации не используется).
    class User(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        first_name = db.Column(db.String(100))
        last_name = db.Column(db.String(100))
        login = db.Column(db.String(80), unique=True)
        email = db.Column(db.String(120))
        password = db.Column(db.String(64))
       # Отображение в административном интерфейсе
        def __unicode__(self):
            return self.username
    
    # Define login and registration forms
    class LoginForm(form.Form):
        login = fields.TextField(validators=[validators.required()])
        password = fields.PasswordField(validators=[validators.required()])
    
        def validate_login(self, field):
            
            if app.config['USERNAME'] != self.login.data:
                raise validators.ValidationError('Invalid user')
    
            if app.config['PASSWORD'] != self.password.data:
                raise validators.ValidationError('Invalid password')
        # присудствовало в оригинальном файле при хранение акаунта в базе данных         
        #def get_user(self):
        #    return db.session.query(User).filter_by(login=self.login.data).first()
    
    def logged_in():
        # в сессии будет храниться информация о том, что пользователь вошёл
        return session.get('logged')
            
    # Create customized model view class
    class MyModelView(sqla.ModelView):
    
        def is_accessible(self):
            return logged_in()
        
        def _handle_view(self, name, **kwargs):
            if not logged_in():
                # делать редирект в некоторых случаях не стоит
                return redirect(url_for('.login_view'))
    
    
    # Create customized index view class that handles login & registration
    class MyAdminIndexView(admin.AdminIndexView):
    
        @expose('/')
        def index(self):
            if not logged_in():
                return redirect(url_for('.login_view'))
            return super(MyAdminIndexView, self).index()
    
        @expose('/login/', methods=('GET', 'POST'))
        def login_view(self):
            # handle user login
            form = LoginForm(request.form)
            if helpers.validate_form_on_submit(form):
                #использовалось в оригинальном фале при авторизацию через базу данных
                #user = form.get_user()
                #login.login_user(user)
                session.update({'logged':True}) # возможно задаю не правильно, подправте если не так!
                session.modified = True
    
            if logged_in():
                return redirect(url_for('.index'))
            link = '<p>Don\'t have an account? <a href="' + url_for('.register_view') + '">Click here to register.</a></p>'
            self._template_args['form'] = form
            self._template_args['link'] = link
            return super(MyAdminIndexView, self).index()
      
        @expose('/logout/')
        def logout_view(self):
            session.pop('logged', None)
            return redirect(url_for('.index'))
    
    
    # views клиентской части  #############################################################
    @app.route('/')
    def index():
        return render_template('index.html')
    
    ########################################################################################  
    
    # Create admin
    admin = admin.Admin(app, 'Админка', index_view=MyAdminIndexView(), base_template='my_master.html')
    
    # Add view
    admin.add_view(MyModelView(User, db.session))
    
    if __name__ == '__main__':
        # Start app
        app.run(debug=True)


    Добавлю:
    пока не изменишь значение app.config['SECRET_KEY'] = '12345678290244' войти на страницу авторизации не получается. постоянно выдает выше указанный Traceback

    ############################################
    Вместо:
    session.update({'logged':True})
    session.modified = True
    указывал:
    session['logged'] = True

    Результат тотже. :(

    !!!!!!!!!!!!!!!!!!!!! РЕШЕНО !!!!!!!!!!!!!!!!!!!!!!

    Нужно просто в файле ...\app\templates\admin\index.html сменить:

    {% if current_user.is_authenticated() %}
    на
    {% if session.logged %}

    Единственно что хотелось бы узнать у знающих людей насколько безопасен данный метод???
    Ответ написан
  • Как вызывать фьюшки из темплея?

    @89109983838 Автор вопроса
    Спасибо! буду работать над терминологией и более внимательно читать ман...
    Ответ написан