greyli / helloflask

Hello, Flask!
https://docs.helloflask.com
MIT License
1.87k stars 2.53k forks source link

为 MethodView 中的方法提供不同的装饰器使用 #222

Closed tangzzz-fan closed 3 years ago

tangzzz-fan commented 3 years ago

Hi, 我在使用比如

class PhotosAPI(MethodView):
    decorators = [auth_required]

    def get(self):
        """Get current user's all photos."""
        page = request.args.get('page', 1, type=int)
        per_page = current_app.config['ALBUMY_MANAGE_PHOTO_PER_PAGE']
        pagination = Photo.query.with_parent(g.current_user).paginate(page, per_page)
        photos = pagination.items
        current = url_for('.photos', page=page, _external=True)
        prev = None
        if pagination.has_prev:
            prev = url_for('.photos', page=page - 1, _external=True)
        next = None
        if pagination.has_next:
            next = url_for('.photos', page=page + 1, _external=True)
        return jsonify(photos_schema(photos, current, prev, next, pagination))

        def post(self):
        """Create new item."""
        username = request.form['username']
        email = request.form['email']
        photo = Photo(username=username, email=email)
        db.session.add(photo)
        db.session.commit()
        response = jsonify(photos_schema(photo))
        response.status_code = 201
        response.headers['Location'] = url_for('.photo', item_id=photo.id, _external=True)
        return response

这个方法里, 我想为全局提供一个 posts 方法, 不需要认证的, 这时候可以怎么实现呢? 我目前采用的方法是: 提供 class AllPhotosAPI 来实现, 但是感觉这样实现太丑陋了, 想问一下是否有更好的实现方法. 谢谢啦

greyli commented 3 years ago

这里有一个实现方法可以参考下。