发布时间:2019/02/09 22:42:17   更新时间:2020/07/31 19:51:56
from flask import Blueprint
page_bp = Blueprint("page", __name__)
#在后边import本文件的其他模块,因为这些模块还需要import蓝图。
#先定义蓝图,然后配置路由,是蓝图的使用方法。只不过这里分模块了。
import Route
import Errors
#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))
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'])
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