Estrutura do Flask - (visualização avançada)
1. Class View
Introdução:
A vantagem do modo de exibição de classe é que ele suporta herança, mas o modo de exibição de classe não pode ser o mesmo que o modo de exibição de função. Depois de escrever o modo de
exibição de classe, você precisa se registrar através de app.add_url_rule (url_rule, view_func).
1-1. Vista padrão
Introdução: a
visão padrão é herdada de flask.views.View, e o método dispatch_request deve ser implementado na subclasse. Este método é semelhante à função de visão, mas também retorna um objeto baseado em Resposta ou em sua subclasse.
Exemplo de código:
from flask.views import View
class PersonalView(View):
def dispatch_request(self):
return "测试页"
# 类视图通过add_url_rule⽅法和url做映射
app.add_url_rule('/users/',view_func=PersonalView.as_view('personalvi
ew'))
1-2. Veja com base no método de programação
Introdução:
Flask também nos fornece outro tipo de visualização flask.views.MethodView, que executa funções diferentes para cada método HTTP (mapeado para o método correspondente de mesmo nome).
Exemplo de código:
class LoginView(views.MethodView):
# 当客户端通过get⽅法进⾏访问的时候执⾏的函数
def get(self):
return render_template("login.html")
# 当客户端通过post⽅法进⾏访问的时候执⾏的函数
def post(self):
email = request.form.get("email")
password = request.form.get("password")
if email == '[email protected]' and password == '111111':
return "登录成功!"
else:
return "⽤户名或密码错误!"
# 通过add_url_rule添加类视图和url的映射,并且在as_view⽅法中指定该url的名称,⽅便url_for函数调⽤
app.add_url_rule('/myuser/',view_func=LoginView.as_view('loginview')
)
Uma das desvantagens de usar visualizações de classe é que é mais difícil decorar com decoradores, como às vezes quando a verificação de permissão é necessária
Exemplo de código:
from flask import session
def login_required(func):
def wrapper(*args,**kwargs):
if not session.get("user_id"):
return 'auth failure'
return func(*args,**kwargs)
return wrapper
Depois que o decorador é escrito, você pode definir uma propriedade chamada decoradores na visualização da classe e, a seguir, armazenar o decorador. Este decorador será executado sempre que esta classe de visão for chamada no futuro.
Exemplo de código:
class UserView(views.MethodView):
decorators = [user_required]
...
2. Projetos e subdomínios
2-1. Projeto
Introdução:
a URL e as funções de visualização que escrevemos antes estão todas no mesmo arquivo. Se o item for maior, obviamente não é uma estrutura razoável. O projeto pode nos ajudar de maneira elegante a atingir esse requisito.
Exemplo de código:
from flask import Blueprint
bp = Blueprint('user',__name__,url_prefix='/user/')
@bp.route('/')
def index():
return "⽤户⾸⻚"
@bp.route('profile/')
def profile():
return "个⼈简介"
Em seguida, no programa principal, app.register_blueprint()
registramos esse blueprint no mapeamento de url por meio do método e observamos a implementação do aplicativo principal.
Exemplo de código:
from flask import Flask
import user
app = Flask(__name__)
app.register_blueprint(user.bp)
if __name__ == '__main__':
app.run(host='0.0.0.0',port=9000)
As visitas posteriores a / user / e / user / profile / são todas
funções de visualização no arquivo user.py executado , conseguindo assim a modularização do projeto.
O texto acima é uma breve introdução ao blueprint, mas ainda há outras áreas a serem observadas ao usar o blueprint, ou seja, como localizar arquivos estáticos e arquivos de modelo no blueprint e como a função url_for inverte o url.
2-1-1. Encontre arquivos estáticos
Introdução:
Por padrão, nenhum caminho de arquivo estático é definido. Jinja2 irá procurar por arquivos estáticos na pasta estática do projeto. Você também pode definir outros caminhos. Ao inicializar o blueprint, o construtor Blueprint tem um parâmetro static_folder que pode especificar o caminho do arquivo estático
Exemplo de código:
bp = Blueprint('admin',__name__,url_prefix='/admin',template_folder='templates')
Há uma pequena diferença entre arquivos de modelo e arquivos estáticos. Depois que o código acima for escrito, se você renderizar um modelo return render_template('admin.html')
, o Flask irá procurar o arquivo admin.html na pasta de modelos no diretório raiz do projeto por padrão. Se ele o encontrar , ele retornará diretamente.Se não for encontrado, vá para a pasta de modelos no diretório onde o arquivo de blueprint está localizado.
2-1-2. url_for
Gerar URL
Introdução:
com url url_for modelo gerado, o formato é: 蓝图名称+.+视图函数名称
. Por exemplo, para obter o url da função de visualização do índice sob o plano de admin
Exemplo de código:
url_for('admin.index')
O nome do blueprint é o primeiro parâmetro passado ao criar o blueprint
bp = Blueprint('admin',__name__,url_prefix='/admin',template_folder='templates')
2-2. Subdomínio
Introdução: os
subdomínios são usados em muitos sites. Por exemplo, se um site se chama xxx.com, podemos definir um subdomínio cms.xxx.com como o URL do sistema de gerenciamento do cms. A realização de subdomínios geralmente é realizada por meio de projetos No capítulo anterior, quando criamos o blueprint, adicionamos um url_prefix = / user como o prefixo da url, para que possamos acessar a url sob user através de / user /. No entanto, não é necessário usar subdomínios. Além disso, SERVER_NAME precisa ser configurado, por
exemplo app.config[SERVER_NAME]='example.com:9000'
. E ao registrar o blueprint, você também precisa adicionar um parâmetro de subdomínio, que é o nome do subdomínio.
Exemplo de código:
from flask import Blueprint
bp = Blueprint('admin',__name__,subdomain='admin')
@bp.route('/')
def admin():
return 'Admin Page'
Isso não é muito diferente, vamos dar uma olhada na implementação do aplicativo principal
Exemplo de código:
from flask import Flask
import admin
# 配置`SERVER_NAME`
app.config['SERVER_NAME'] = 'example.com:8000'
# 注册蓝图,指定了subdomain
app.register_blueprint(admin.bp)
if __name__ == '__main__':
app.run(host='0.0.0.0',port=8000,debug=True)
dicas: depois de
escrever os dois arquivos acima, o nome do subdomínio admin.example.com:8000 não pode ser acessado normalmente, porque não adicionamos a resolução do nome de domínio ao arquivo host, você pode adicionar uma linha de 127.0.0.1 admin.example em final. com, você pode acessá-lo. Além disso, o subdomínio não pode aparecer em 127.0.0.1, nem pode aparecer em localhost.