Ответы пользователя по тегу Flask
  • Почему продолжается подставление слеша в url?

    Tark
    @Tark
    Pyramid'альный мир
    Flask’s URL rules are based on Werkzeug’s routing module. The idea behind that module is to ensure beautiful and unique URLs based on precedents laid down by Apache and earlier HTTP servers.

    Take these two rules:
    
    @app.route('/projects/')
    def projects():
        return 'The project page'
    
    @app.route('/about')
    def about():
        return 'The about page'

    Though they look rather similar, they differ in their use of the trailing slash in the URL definition. In the first case, the canonical URL for the projects endpoint has a trailing slash. In that sense, it is similar to a folder on a filesystem. Accessing it without a trailing slash will cause Flask to redirect to the canonical URL with the trailing slash.

    In the second case, however, the URL is defined without a trailing slash, rather like the pathname of a file on UNIX-like systems. Accessing the URL with a trailing slash will produce a 404 “Not Found” error.
    _____________
    И раньше, когда я еще не проводил через такой роут /<int:info>/, к примеру, 3 То подстановки не было, а после есть. (с) - что это значит?

    Если у вас сейчас путь без слеша перенаправляется на путь со слешем, то это, к сожалению, кеш браузера. Меня очень раздражало в Flask, что приходилось постоянно использовать декоратор "nocache", описанный в самой документации, чтобы страница генерировалась заново при каждом обращении.

    Кроме того, чем вам не нравится перенаправление? Неужели было бы лучше, если бы пользователь сам путь поправил и получил 404? Я сейчас как раз переписываю свой пакет под такое же поведение с перенаправлением.
    Ответ написан
    Комментировать
  • Как передать данные из Flask view в HTML?

    Tark
    @Tark
    Pyramid'альный мир
    Эта конструкция - {{ city.city }} - выдаёт значение как оно есть, без кавычек. Попробуйте написать так:

    console.log("{{ city.city }}");
    Ответ написан
    1 комментарий
  • Как правильно во Flask разделить роуты?

    Tark
    @Tark
    Pyramid'альный мир
    > А можете показать как решает ту же задачу Flask-Classy ?

    from flask import Flask, render_template as render
    from index import IndexView
    from user import UserView
    from admin import AdminView
    
    app = Flask(__name__)
    
    IndexView.register(app)
    UserView.register(app)
    AdminView.register(app)
    
    if __name__ == '__main__':
        app.run(debug=True)


    index.py
    class IndexView(FlaskView):
        route_base = '/'  # кажется, для IndexView по умолчанию / ... но не уверен.
    
        @route('/')
        def index(self):
            return render(...)
    
        @route('/login')
        def login(self):
            return render(...)
    
        @route('/logout')
        def logout(self):
            return render(...)


    user.py
    class UserView(FlaskView):
        # route_base = '/user'  # необязательно
        @route('/')
        def index(self):
            return render(...)
    
        @route('/<int:id>')
        def get_user(self, id):
            return render(...)


    А для админки можно попробовать Flask-Admin.
    Ответ написан
    9 комментариев
  • Как отдать в шаблон найденые в базе данных обьекты?

    Tark
    @Tark
    Pyramid'альный мир
    А зачем вы делаете jsonify? Передавайте прямо так в шаблон, списком обьектов, а в шаблоне работайте как с обьектами. user.id etc...
    Ответ написан
  • Как обновлять содержимое страницы, получаемое парсингом другой страницы в Flask?

    Tark
    @Tark
    Pyramid'альный мир
    Вариант первый, не очень хороший:
    from flask import Flask
    import test  # именно так
    
    app = Flask(__name__)
    
    @app.route('/')
    def main_page():
        # постоянно актуальная информация, даже если переменная изменится в другом месте
        return test.text
    
    if __name__ == '__main__':
        app.run()

    Это плохо тем, что работать будет только с одним воркером. То есть если у вас uwsgi, скажем, с двумя процессами, то часть запросов будет попадать на "старое" значение test.text. Если принудительно работать с одним воркером, будет работать правильно.

    Вариант второй, получше: использовать кеш или БД.
    Ответ написан
    8 комментариев
  • Как "прикрутить" простую авторизацию к flask-admin?

    Tark
    @Tark
    Pyramid'альный мир
    Ну... Первое, что приходит в голову, это сохранение данных для входа в переменных.

    def logged_in():
        # в сессии будет храниться информация о том, что пользователь вошёл
        return session.get('logged')
    
    # от этого класса должны наследоваться все классы админки - кроме индекса
    class MyView(BaseView):
        def is_accessible(self):
            return logged_in()
    
        def _handle_view(self, name, **kwargs):
            if not logged_in():
                # делать редирект в некоторых случаях не стоит
                return self.render('admin/login.html')
    
    class AdminIndex(AdminIndexView):
        @expose('/', methods=['GET', 'POST'])
        def index(self):
            if request.method == 'POST':
                frm = request.form.get
                login = frm('login')
                password = frm('pass')            
    
                # проверяете введённые данные...
                if ...
                    session.update({обновляете сессию})
                    session.modified = True
                    return self.render('admin/index.html')
                else:
                    return self.render('admin/login.html',
                                       error=u'Ошиблись паролем?..')
            # уже вошёл, но перешёл на /admin/
            if logged_in():
                return self.render('admin/index.html')
            return self.render('admin/login.html')
    
        # остальные методы класса


    А с чем возникли сложности?
    Ответ написан
    Комментировать
  • Как убрать Bad Request?

    Tark
    @Tark
    Pyramid'альный мир
    Дело в том, что если чекбокс не отмечен, то никакого параметра в POST/GET не передаётся.

    if request.form['op2']:  # Ой!
        pass
    
    if request.form.get('op2'):  # так гораздо лучше
        pass
    Ответ написан