类视图
标准类视图 View
from flask.views import View,MethodView
# from flask import views
from flask import Flask,url_for,jsonify,render_template,request
app = Flask(__name__)
@app.route('/')
def hello():
print(url_for('PersonaView'))
return "函数视图"
class PersonaView(View):
def dispatch_request(self):
#类视图必须重写,因为父类中有这个方法,否则报出异常
return "标准类视图"
app.add_url_rule('/users/',view_func=PersonaView.as_view('PersonaView'))
# 通过endpoint 可以给函数起名字,用来调用,使用Url_for可以得到该函数的url地址
# view_func=PersonaView 是为了指定类函数 , .as_view('') 这是给函数起名
# 虽然跟 endpoint类似,但endpoint优先级更高点.
基于调度方法的视图 MethodView
对不同的http请求方法执行不同的函数
from flask.views import MethodView
class LoginView(MethodView):
def get(self,error=None):
return render_template('login.html',error=error)
def post(self):
name=request.form.get("name")
password=request.form.get("password")
#查询数据库 验证...
if name== "sang" and password=="123":
return "登陆成功"
else:
return self.get("账号密码错误")
# return render_template('login.html',error="账号密码错误")
类视图中的装饰器
#先登陆才能访问的装饰器
def login_required(func):
def wrapper(*args,**kwargs):
name=request.form.get('name')
if name:
return func(*args,**kwargs)
else:
return "请先登录"
return wrapper
class ProfileView(View):
decorators = [login_required]
def dispatch_request(self):
return "个人页面"
app.add_url_rule('/profile/',view_func=ProfileView.as_view('profile'))
蓝图 blueprint
在做一个项目的时候,如果把所有的文件全部放在一个文件里面会显得很繁琐,使用蓝图,会使代码更加规范。
from flask import Blueprint
book_bp=Blueprint('book',__name__,url_prefix="/book/")
#这里的url_prefix是添加url的前缀,就比如这里加了/book/ 那么 @book_bp.route('/')这里面就不用再写了
@book_bp.route('/')
def book():
return "书籍首页"
@book_bp.route('/detail/<bid>')
def book_detail(bid):
return "图书的id: %s " % bid
如果仅仅是这样把图书首页放在单独的文件里面,然后去主窗口运行,是进入不了 book 的,所以在上面要定义book_bp=Blueprint('book',__name__,url_prefix="/book/")
,它可以标记蓝图的名字为 book_bp,然后在主窗口中注册这个蓝图对象。
from flask import Flask
from blueprint.blueprints.news import news_bp
from blueprint.blueprints.book import book_bp
app=Flask(__name__)
app.register_blueprint(news_bp)
app.register_blueprint(book_bp)
@app.route('/')
def index():
return "主窗口"
if __name__ =='__main__':
app.run
这时候直接运行主窗口,就可以访问到 /news/,/book/
了
注册蓝图对象的静态文件相关路由
from flask import Blueprint,render_template
news_bp=Blueprint('news',__name__,template_folder='newTem',
static_folder='newTem')
# 在这里更改的template_folder,优先级低于默认的template_folder的位置.newTem的文件夹与蓝图文件平级
# 如果在默认位置找不到news.html,那么就会使用这里的
# 静态 static也是这样 ,找不到默认位置的文件后,再找蓝图内的newTem
@news_bp.route('/news/')
def news():
# return "新闻首页"
return render_template('news.html')
子域名
子域名(或子域;英语:Subdomain)是在域名系统等级中,属于更高一层域的域。比如,mail.example.com和calendar.example.com是example.com的两个子域,而example.com则是顶级域.com的子域。
因为flask不支持Ip形式,locahost也不支持,所以需要修改 etc/hosts
在falsk中,子域名也是写在蓝图里面,在子域名py文件里面
from flask import Blueprint
lin_bp=Blueprint('lin',__name__,subdomain='lin')
@lin_bp.route('/')
def lin():
return "子域名页面"
在主界面配置
from blueprint.blueprints.lin import lin_bp
app.register_blueprint(lin_bp)
app.config['SERVER_NAME']='guguai.com:5000'
这样可以访问子域名页面了