flask开发的一些经验(四)

作者:清一

类别:flask   

发布时间:2019/02/09 22:42:17   更新时间:2019/06/20 11:50:32


app/page/__init__.py

from flask import Blueprint

page_bp = Blueprint("page", __name__)

#在后边import本文件的其他模块,因为这些模块还需要import蓝图。
#先定义蓝图,然后配置路由,是蓝图的使用方法。只不过这里分模块了。

import Route
import Errors

app/page/Errors.py

#import 文件夹的__init__.py里边的东西,用如下方法。
from import page_bp

#这里用于全局url找不到的error。凡是在./app/page/Route.py里没有的后缀,都在这里报错。
#注意app_errorhandler用于注册全局错误。据说蓝图用errorhandler,现在测试不行,后续研究。

@page_bp.app_errorhandler(404)
def error_404(e):
    return redirect(url_for("page.error_404", next=request.url))

app/page/Route.py

from Views import TemplateView
from Views import UserTemplateView
from Views import UploadView
from Views import DownloadView

#import 本文件夹的__init__.py里边的东西,用如下方法:
from import page_bp

'''
add_url_rule注册../xxx
'''

#错误页面
#这里用于跳转/error_404/的error,也就是url_for("page.error_404")
page_bp.add_url_rule("/error_404/",
                     view_func=TemplateView.as_view("error_404", template_name="Error_404.html"),
                     methods=['GET''POST'])


#主页面
page_bp.add_url_rule("/",
                     view_func=TemplateView.as_view("main", template_name="Index.html"),
                     methods=['GET''POST'])


#登录页面
page_bp.add_url_rule("/login/",
                     view_func=TemplateView.as_view("login", template_name="Login.html"),
                     methods=['GET''POST'])



#单个文章页面
#这个页面,由前端获取id,然后和后端发ajax消息,要文章内容。
#这个int类型的id,会直接进入TemplateView的context的键值对。这个东西是在模板上用的。
page_bp.add_url_rule("/post/<int:id>/",
                     view_func=TemplateView.as_view("post", template_name="Post.html"),
                     methods=['GET''POST'])

#用户文章页面
page_bp.add_url_rule("/user_posts/",
                     view_func=TemplateView.as_view("user_post", template_name="UserPosts.html"),
                     methods=['GET''POST'])

#用户发表文章页面
page_bp.add_url_rule("/add_post/",
                     view_func=UserTemplateView.as_view("add_post", template_name="AddPost.html"),
                     methods=['GET''POST'])

#用户修改文章页面
page_bp.add_url_rule("/edit_post/<int:id>/",
                     view_func=UserTemplateView.as_view("edit_post", template_name="EditPost.html"),
                     methods=['GET''POST'])

#上传下载
page_bp.add_url_rule("/upload/",
                     view_func=UploadView.as_view("upload"),
                     methods=['GET''POST'])

page_bp.add_url_rule("/download/",
                     view_func=DownloadView.as_view("download"),
                     methods=['GET''POST'])

#socketio的测试页面
page_bp.add_url_rule("/socketio_test/",
                     view_func=UserTemplateView.as_view("socketio_test", template_name="socketio_test.html"),
                     methods=['GET''POST'])

app/page/Views.py


download_lock = False

class TemplateView(MethodView):
    decorators = [Decorator.request_pretreat]
    def __init__(self, template_name):
        self.template_name = template_name
        return

    #注意,动态域名的键值对,会直接进入context。
    def get(self, **context):
        return render_template(self.template_name, **context)

    def post(self, **context):
        return render_template(self.template_name, **context)

    def put(self, **context):
        return render_template(self.template_name, **context)

    def delete(self, **context):
        return render_template(self.template_name, **context)


class UserTemplateView(MethodView):#增加需要登录装饰器,request打印装饰器。
    decorators = [login_required, Decorator.request_pretreat]
    def __init__(self, template_name):
        self.template_name = template_name
        return

    def get(self, **context):
        return render_template(self.template_name, **context)

    def post(self, **context):
        return render_template(self.template_name, **context)

    def put(self, **context):
        return render_template(self.template_name, **context)

    def delete(self, **context):
        return render_template(self.template_name, **context)

class UploadView(MethodView):
    decorators = [login_required, Decorator.request_pretreat]
    def __init__(self):
        return

    def post(self):
        file = request.files.get("file""")
        assert ""!=file
        #限定上传命名类型
        #assert ".xml" in str(file)

        filename = file.filename
        if os.path.isfile(load_datas_dir + filename):
            os.remove(load_datas_dir + filename)

        #存储文件,获取文件名。
        file_name = datas.save(file)
        #这里的file_name不一定等于filename,前者是linux自动产生了,后者是windows上客户传入的原始的。

        #获取文件url,它是文件在服务器上的地址。
        file_url = datas.url(file_name)

        return file_url

 


本文属于原创文章,未经许可,任何媒体、公司或个人不得刊发或转载。

本文网址:https://www.pyfield.com/blog/?id=6