Estrutura do Flask - (visualização avançada)

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_forGerar 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.

Acho que você gosta

Origin blog.csdn.net/weixin_45550881/article/details/105627990
Recomendado
Clasificación