网易首页 > 网易号 > 正文 申请入驻

Python高级编程:web开发之Flask

0
分享至

1. Flask 简介

Flask 是一个轻量级的 Python Web 应用框架,被称为"微框架"(micro-framework)。它基于 Werkzeug WSGI 工具包和 Jinja2 模板引擎,提供了 Web 开发所需的核心功能,同时保持了高度的灵活性和扩展性。

1.1 Flask 的特点

  • 轻量级: 核心简单但是扩展性强

  • 灵活性: 不强制特定的项目布局或依赖

  • 容易上手: 简单的 API 设计,清晰的文档

  • 强大的扩展生态: 丰富的第三方扩展支持

  • 活跃的社区: 持续的维护和更新

1.2 安装 Flask

pip install flask
2. Flask 基础2.1 第一个 Flask 应用

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run(debug=True)
2.2 路由系统2.2.1 基本路由

@app.route('/user')
def user_page():
    return 'User Page'
2.2.2 动态路由

@app.route('/user/ ') 
def show_user_profile(username):
    return f'User {username}'

@app.route('/post/ ') 
def show_post(post_id):
    return f'Post {post_id}'
2.2.3 HTTP 方法

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return 'Processing login...'
    return 'Please login'
3. 模板引擎(Jinja2)3.1 基本用法

from flask import render_template

@app.route('/hello/ ') 
def hello(name):
    return render_template('hello.html', name=name)

模板文件hello.html:

html>


    Hello Page title>
 head>

    Hello {{ name }}! h1> body> html>
3.2 模板语法3.2.1 变量

{{ variable }}
3.2.2 控制结构

{% if user %}
    Hello, {{ user }}!
{% else %}
    Hello, Stranger!
{% endif %}

{% for item in items %}
    
  • {{ item }} li> {% endfor %}
  • 4. 表单处理4.1 基本表单

from flask import request

@app.route('/submit', methods=['GET', 'POST'])
def submit():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        return f'Received: {username}'
    return '''                                                              '''
4.2 Flask-WTF 表单

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired

class LoginForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired()])
    password = PasswordField('Password', validators=[DataRequired()])
    submit = SubmitField('Login')
5. 数据库集成5.1 Flask-SQLAlchemy

from flask_sqlalchemy import SQLAlchemy

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
6. 用户认证6.1 Flask-Login

from flask_login import LoginManager, UserMixin, login_user, login_required

login_manager = LoginManager()
login_manager.init_app(app)

class User(UserMixin, db.Model):
     # 用户模型定义 
    pass

@login_manager.user_loader
def load_user(user_id):
    return User.query.get(int(user_id))

@app.route('/protected')
@login_required
def protected():
    return 'Protected area'
7. RESTful API 开发7.1 基本 REST API

@app.route('/api/users', methods=['GET'])
def get_users():
    users = User.query.all()
    return jsonify([{'id': user.id, 'username': user.username} for user in users])

@app.route('/api/users/ ', methods=['GET']) 
def get_user(user_id):
    user = User.query.get_or_404(user_id)
    return jsonify({'id': user.id, 'username': user.username})
7.2 Flask-RESTful

from flask_restful import Resource, Api

api = Api(app)

class UserResource(Resource):
    def get(self, user_id):
        user = User.query.get_or_404(user_id)
        return {'id': user.id, 'username': user.username}

api.add_resource(UserResource, '/api/users/ ' )
8. 项目结构

推荐的项目结构:

myproject/
    ├── app/
    │   ├── __init__.py
    │   ├── models.py
    │   ├── routes.py
    │   └── templates/
    ├── config.py
    ├── requirements.txt
    └── run.py
9. 部署9.1 生产环境配置

# config.py 
class ProductionConfig:
    DEBUG = False
    SQLALCHEMY_DATABASE_URI = 'postgresql://user:password@localhost/dbname'
    SECRET_KEY = 'your-secret-key'
9.2 使用 Gunicorn 部署

pip install gunicorn
gunicorn -w 4 -b 127.0.0.1:8000 run:app
10. 最佳实践10.1 错误处理

@app.errorhandler(404)
def not_found_error(error):
    return render_template('404.html'), 404

@app.errorhandler(500)
def internal_error(error):
    db.session.rollback()
    return render_template('500.html'), 500
10.2 日志配置

import logging
from logging.handlers import RotatingFileHandler

if not app.debug:
    file_handler = RotatingFileHandler('logs/myapp.log', maxBytes=10240, backupCount=10)
    file_handler.setFormatter(logging.Formatter(
        '%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]'
    ))
    file_handler.setLevel(logging.INFO)
    app.logger.addHandler(file_handler)
11. 进阶主题11.1 蓝图(Blueprints)

from flask import Blueprint

admin = Blueprint('admin', __name__)

@admin.route('/dashboard')
@login_required
def dashboard():
    return render_template('admin/dashboard.html')
11.2 Flask 信号

from flask import signals

def handle_user_login(sender, user):
    app.logger.info(f'User {user.username} logged in')

user_logged_in.connect(handle_user_login)
12. 调试与测试12.1 调试模式

app.run(debug=True)
12.2 单元测试

import unittest

class TestCase(unittest.TestCase):
    def setUp(self):
        self.app = create_app('testing')
        self.client = self.app.test_client()

    def test_home_page(self):
        response = self.client.get('/')
        self.assertEqual(response.status_code, 200)
总结

Flask 是一个强大而灵活的 Web 框架,适合各种规模的项目开发。通过本教程,我们覆盖了从基础到高级的主要开发概念和实践。要成为一个优秀的 Flask 开发者,建议:

  1. 深入理解 Flask 的核心概念

  2. 熟练掌握常用扩展

  3. 遵循最佳实践

  4. 注重代码质量和测试

  5. 持续学习和实践

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
“把制造业交给我们吧,这样对美国也好”

“把制造业交给我们吧,这样对美国也好”

观察者网
2025-01-06 13:24:08
中国6大长寿食物,鱼排第3,第一名经常被当早餐,有你爱吃的吗?

中国6大长寿食物,鱼排第3,第一名经常被当早餐,有你爱吃的吗?

小谈食刻美食
2024-11-13 19:35:06
北京卫视主持人赴缅北失联!家人曝细节求助,消失3个月音讯全无

北京卫视主持人赴缅北失联!家人曝细节求助,消失3个月音讯全无

娱乐圈圈圆
2025-01-06 12:19:35
2025年,个人劳务报酬所得税或将发生调整,税负由40%降至2%

2025年,个人劳务报酬所得税或将发生调整,税负由40%降至2%

税廉
2025-01-06 15:52:26
CBA已进入后半程,联盟档次清晰,11队已上岸,剩一名额五队争夺

CBA已进入后半程,联盟档次清晰,11队已上岸,剩一名额五队争夺

体坛热消息
2025-01-06 14:49:33
朱晓刚谈广州队未过准入:前两天在那学习时,小队员还说没问题了

朱晓刚谈广州队未过准入:前两天在那学习时,小队员还说没问题了

直播吧
2025-01-06 16:22:21
张嘉倪退圈跑路?网友:带着孩子跑路去了澳洲!

张嘉倪退圈跑路?网友:带着孩子跑路去了澳洲!

毒舌八卦
2025-01-04 21:14:51
2025年,山东养老金将上涨,社保还有3个新变化,具体是什么?

2025年,山东养老金将上涨,社保还有3个新变化,具体是什么?

兵哥闲聊
2025-01-06 12:28:16
詹皇率浓眉雷迪克狂喷裁判!连带火箭被骂,摊牌NBA,绝不受欺负

詹皇率浓眉雷迪克狂喷裁判!连带火箭被骂,摊牌NBA,绝不受欺负

嘴炮体坛
2025-01-06 12:37:23
驳回!尹锡悦再遭重击!

驳回!尹锡悦再遭重击!

文学故事家
2025-01-05 19:33:06
佟丽娅,身高164厘米,展示了她在化妆间里吃东西的画面。

佟丽娅,身高164厘米,展示了她在化妆间里吃东西的画面。

人情皆文史
2024-11-26 22:44:56
突发!央行释放史诗级利好!2亿股民闻讯狂喜!A股开启大涨?

突发!央行释放史诗级利好!2亿股民闻讯狂喜!A股开启大涨?

风风顺
2025-01-06 07:54:43
侯耀华太敢说了:阻拦马三立老先生收李文华的,就是我爸爸侯宝林

侯耀华太敢说了:阻拦马三立老先生收李文华的,就是我爸爸侯宝林

阿凫爱吐槽
2025-01-06 08:56:22
大意了!身体被甲流感染,中招之后有4个“没想到”,不吐不快

大意了!身体被甲流感染,中招之后有4个“没想到”,不吐不快

荷兰豆爱健康
2025-01-06 11:06:10
2025年1月起,江苏养老金、医保、丧葬费抚恤金将有新变化,看看

2025年1月起,江苏养老金、医保、丧葬费抚恤金将有新变化,看看

阿伧说事
2025-01-06 11:18:59
故事:女子一月交高额燃气费,一怒之下关掉阀门,隔壁却传来尖叫

故事:女子一月交高额燃气费,一怒之下关掉阀门,隔壁却传来尖叫

呆呆文化
2025-01-02 15:36:19
女子出轨被外甥意外发现,外甥:保密可以,但你要答应我一个条件

女子出轨被外甥意外发现,外甥:保密可以,但你要答应我一个条件

林林故事揭秘
2024-12-12 10:55:59
感染甲流后,1-7天症状对照表

感染甲流后,1-7天症状对照表

荷兰豆爱健康
2025-01-06 16:12:04
福建在建一座4F国际机场,总投资555.74亿元,预计2026年投入使用

福建在建一座4F国际机场,总投资555.74亿元,预计2026年投入使用

南南史
2025-01-06 10:42:06
终于知道为啥家人得了大病要隐瞒!评论区分享一针见血,太真实了

终于知道为啥家人得了大病要隐瞒!评论区分享一针见血,太真实了

热闹的河马
2024-11-23 09:57:10
2025-01-06 18:15:00
机器学习与Python社区 incentive-icons
机器学习与Python社区
机器学习算法与Python
2765文章数 10351关注度
往期回顾 全部

科技要闻

国内至少50团队研发AI眼镜 但无核心卖点

头条要闻

多人称在小程序买购物卡后公司失联不发货 涉案百万元

头条要闻

多人称在小程序买购物卡后公司失联不发货 涉案百万元

体育要闻

阿诺德的心飞到马德里了?

娱乐要闻

星星女友辟谣!还未取得联系

财经要闻

瑞立科密销售模式信披或"偷梁换柱"

汽车要闻

10万元级无图智驾 悦也PLUS全路况实测

态度原创

手机
本地
房产
数码
公开课

手机要闻

众筹价99元起!小米发布米家智能哑铃:内置课程指导

本地新闻

云游中国|冰雪“祁”缘照进现实,谁懂多震撼

房产要闻

中交 × 鱼珠 | 高定江景梦幻联动,打造都市精英的 “临江乌托邦”

数码要闻

消息称树莓派 5 将推出 16GB 内存版本,CES 2025 期间发布

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版