Python框架之Flask入门和视图

一、Flask入门和视图

需要安装Pycharm专业版

1. Flask简介

Python后端的2个主流框架

  • Flask 轻量级框架
  • Django 重型框架
    在这里插入图片描述
  • Flask是一个基于Python实现的web开发微框架

    官方文档:https://flask.palletsprojects.com/

    中文文档:https://dormousehole.readthedocs.io/

  • Flask是一个基于MVC设计模式的Web后端框架

    • MVC:
      • M: Model 数据模型
      • V: View 界面
      • C: Controller 控制器
    • MVT:
      • M: Models 模型(数据)
      • V: Views 视图(控制器)
      • T: Templates 模板(界面)
  • Flask依赖的三个库

    • Jinja2:模板引擎 {% %}
      • 模板:静态HTML+模板语言{% %}
    • Werkzeug WSGI 工具集
  • Flask流行的主要原因

    • 1.有非常齐全的官方文档,上手非常方便工
    • 2.有非常好的扩展机制和第三方扩展环境,工作中常见的软件都会有对应的扩展。自己动手实现扩展也很容易
    • 3.社区活跃度非常高
    • 4.微型框架的形式给了开发者更大的选择空间

2. 创建虚拟环境

# 打开CMD# 安装virtualenv虚拟环境(windows)
pip install virtualenv virtualenvwrapper-win# 查看虚拟环境
workon
# 切换/进入虚拟环境
workon env-name# 新建虚拟环境
mkvirtualenv env-name# 删除虚拟环境
rmmkvirtualenv env-name

3. 使用Flask

第一个Flask项目

  • 创建项目

    • 选择虚拟环境:workon flask2env

    • 在虚拟环境中安装Flask2:pip install flask==2.2.3

      添加现有解释器,在Windows当前用户下的Envs目录下。如C:\Users\username\Envs\flask2env\Scripts\python.exe

    • 打开Pycharm专业版,创建好Flask项目并配置好虚拟环境flask2env

    • 创建helloFlask.py,示例代码如下:

      # 导入Flask应用对象
      from flask import Flask# 创建Flask应用对象
      app = Flask(__name__)# 路由+视图函数hello_world
      @app.route('/')
      def hello_world():  # put application's code here# 响应:返回给浏览器的数据return 'Hello World!'# 添加一个路由和视图函数
      @app.route('/index/')
      def index():return 'Index 首页'if __name__ == '__main__':# 启动服务器app.run()
    • 启动参数相关,run()启动的时候还可以添加参数:

      • debug 是否开启调试模式,开启后修改过python代码会自动重启
      • port 启动指定服务器的端口号,默认是5000
      • host 主机,默认是127.0.0.1,指定为0.0.0.0代表本机所有ip
  • 注意:

    • 有Anaconda的若是Python版本不一致可以按照如下切换python版本

      # 安装一个python 3.9的环境
      conda create -n py39 python=3.9# 激活这个新配置的环境 ,这样就切换了python版本
      conda activate py39# 列出当前安装的所有pyhon环境
      conda info -e # 如果切换环境后,又想回到之前的环境,可以通过命令
      conda deactivate# 删除一个已有的环境
      conda remove --name python34 --all
      
    • 如果遇到报错:ImportError:cannot import name 'url_quote' from 'werkzeug.urls'

      是因为flask2.2.3版本不兼容Werkzeug3.0以上

      因此我们可以在虚拟环境中执行

      pip install Werkzeug==2.3.7
      
    • app.run参数无效问题

      • 运行app.run(host="127.0.0.1",port=5002,debug=True),但是服务启动后,还是默认的ip和端口http://127.0.0.1:5000,debug模式也是off
      • 原因:pycharm识别出你是flask项目
      • 解决方案:切换为python的运行模式,重新编辑配置,配置编辑>运行/调试配置>新增Pyhton配置运行当前文件即可。查看更详细说明

4. 模板渲染

  • 模板渲染,使用render_template('xxx.html',name='张三法外狂徒')

    • xxx.html是在templates目录下的xxx.html文件
    • xxx.html文件中使用{{name}}可以取到传过来的name值
    from flask import Flask, render_template, jsonifyapp = Flask(__name__)
    app.config['DEBUG'] = True@app.route('/')
    def home():# 返回字符串return 'Flask Home1'# 模板渲染
    @app.route('/index/')
    def index():# 返回字符串:支持HTML标签# return '<h1>Flask Index</h1>'# 模板渲染 这是目录templates下的index.html,name可以在index中使用模板语法{{name}}取到return render_template('index.html', name='法外狂徒张三')# JSON# jsonify:序列化# return jsonify({'name': '张三', 'age': 33})if __name__ == '__main__':# 启动服务器 不生效app.run(debug=True, port=5001, host='127.0.0.2')
    
  • 使用将static的css文件导入到template下的html文件中

    • 静态使用,相当于反向解析:url_for('static', filename='hello.css')

      指定static目录下的hello.css

      • 在对应的html文件中使用
      <html lang="en">
      <head><meta charset="UTF-8"><title>Title</title>{#  3种导入静态文件的方式  #}<!--<link rel="stylesheet" href="../static/index.css">  --><!--<link rel="stylesheet" href="/static/index.css">  -->{#  这是目录static下的index.css  #}<link rel="stylesheet" href="{{ url_for('static',filename='index.css') }}"></head>
      <body><h2>Index</h2><hr/><h4>name:{{ name }}</h4>
      </body>
      </html>
      

5. 项目拆分

代码全都写在app.py一个文件中是不现实的我们可以对项目进行简单拆分

  • 在项目顶级目录,新建目录App(包),App目录里面新建static和templates目录,新建文件__init__.py,新建views.pymodels.py

  • 蓝图blueprint

    • 宏伟蓝图(宏观规划)

    • 蓝图也是一种规划,主要用来规划urls(路由route)

    • 蓝图基本使用

      • 在views.py中初始化蓝图

        blue = Blueprint( 'user', __name__)
        
      • __init__.py文件中调用蓝图进行路由注册

        app.register_blueprint(blueprint=blue)
        
  • 项目文件结构及内容如下
    在这里插入图片描述

    • __init__.py

      # __init__.py : 初始化文件,创建Flask应用
      from flask import Flask
      from .views import bluedef create_app():app = Flask(__name__)# 注册蓝图app.register_blueprint(blueprint=blue)return app
      
    • views.py

      # views.py : 路由和视图函数
      from flask import Blueprint
      from .models import *# 初始化蓝图 蓝图名
      blue = Blueprint('user', __name__)@blue.route('/')
      def index():return 'index'
      
    • models.py

      # model.py : 模型,数据库
      
    • app.py

      from App import create_app
      # 创建app
      app = create_app()
      if __name__ == '__main__':app.run(debug=True)
      

6. route 路由

I. 路由参数

  • 路由:将从客户端发送过来的请求分发到指定函数上

  • 路由通过装饰器对应视图函数,并且可以接收参数,所以我们只需要在视图函数上使用装饰器即可

  • 语法:

    @app.route('/rule/')def hello() :return 'Hello World!'
    @app.route('/rule/<id>/')def hello(id):return 'Hello %s' % id
    
  • 写法
    <converter : variable_name>

    • converter: 路由参数类型

      • string接收任何没有斜杠(‘/’)的字符串(默认)

      • int接收整型

      • float接收浮点型

      • path接收路径,可接收斜线(‘/’)

      • uuid只接受uuid字符串,唯一码,一种生成规则

      • any可以同时指定多种路径,进行限定,从列出的项目中选择一个(不能选其他值)

    • variable_name:变量名

‖. 请求方法

  • 默认支持GET,HEAD,OPTIONS,如果想支持某一请求方式,需要自己手动指定

    @app.route( '/rule/' , methods=[ 'GET' , ' POST'])
    def hello():return 'LOL'
    
  • methods中可以指定请求方法

    • GET
    • POST
    • HEAD
    • PUT
    • DELETE

III. 请求和响应

  • Request

    服务器在接收到客户端的请求后,会自动创建Request对象,由Flask框架创建,Request对象不可修改

    • 属性:

      • url:完整请求地址
      • base_url去掉GET参数URL
      • host_url只有主机和端口号URL
      • path:路由中的路径
      • method:请求方法
      • remote_addr:请求的客户端地址
      • args:GET请求参数
      • form:POST请求参数
      • files:文件上传
      • headers:请求头
      • cookies:请求中的cookie
    • ImmutableMultiDict类型:

      • 类似字典的数据结构,与字典的区别,可以存在相同的键
        argsformfiles都是ImmutableMultiDict的对象
      • ImmutableMultiDict中数据获取方式:
        • dict['uname']dict.get('uname')
        • 获取指定key对应的所有值:dict.getlist( 'uname')
    • args

      • get请求参数的包装,args是一个ImmutableMultiDict对象,类字典结构对象
      • 数据存储也是key-value,外层是列表,列表中的元素是元组,元组中左边是key,右边是value
    • form

      • 存储结构跟args一致

      • 默认是接收post参数

      • 还可以接收PUTPATCH参数

  • Response

    Response:服务器返回给客户端的数据

    由程序员创建,返回Response对象

    • 直接返回字符串,可以返回文本内容,状态码

    • render_template渲染模板,将模板转换成字符串(前后端不分离)

    • 返回json(前后端分离)

    • 自定义响应对象
      a. 使用make_response(data,code)

      • data返回的数据内容

      • code状态码

      b.使用Response对象

  • 重定向

    • redirect

      • redirect('http://www.qq.com')
      • redirect('/get_response/')
    • url_for结合反向解析

      反向解析,根据函数名字,获取反向路径#

      url_for("蓝图名.函数名") url_for('函数名',参数名=value)

      redirect(url_for('user.get_response'))
      redirect(url_for('user.get_request', like=apple'))
      
  • 终止执行,抛出异常

  • 主动终止:abort(code)

  • 捕获异常

    @app.errorhandler(404)
    def hello(e) :return 'LOL'
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/178459.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPF RelativeSource属性-目标对象类型易错

上一篇转载了RelativeSource的三种用法&#xff0c;其中第二种用法较常见&#xff0c;这里记录一下项目中曾经发生错误的地方&#xff0c;以防自己哪天忘记了&#xff0c;又犯了同样错误—WPF RelativeSource属性-CSDN博客 先回顾一下&#xff1a; 控件关联其父级容器的属性—…

物联网AI MicroPython传感器学习 之 QMC5883指南针罗盘传感器

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 一、产品简介 QMC5883是一款表面贴装的集成了信号处理电路的三轴磁性传感器&#xff0c;应用场景主要包括罗盘、导航、无人机、机器人和手持设备等一些高精度的场合。 引脚定义 VCC&#xff1a;3V3&#…

在Qt中List View和List Widget的区别是什么,以及如何使用它们

2023年10月29日&#xff0c;周日晚上 目录 List View和List Widget的区别 如何使用QListView 如何使用QListWidget List View和List Widget的区别 在Qt中&#xff0c;QListView 和 QListWidget 是用于显示列表数据的两个常用控件&#xff0c;它们有一些区别和特点。 1. 数…

遥遥领先,免费开源的django4-vue3项目

星域后台管理系统前端介绍 &#x1f33f;项目简介 本项目前端基于当下流行且常用的vue3作为主要技术栈进行开发&#xff0c;融合了typescript和element-plus-ui&#xff0c;提供暗黑模式和白昼模式两种主题以及全屏切换&#xff0c;开发bug少&#xff0c;简单易学&#xff0c…

新手必看的Facebook广告投放基础思路

一、广告账号要求 如果您还没有Facebook账号&#xff0c;那么第一步是准备Facebook账号。 1、配置正确的网络环境 Facebook账号需要在稳定安全的网络环境中运行&#xff0c;否则很容易导致封禁。像我们常用的是Maskfog指纹浏览器&#xff0c;可以通过自定义浏览器指纹与为环…

私有网络的安全保障,WorkPlus Meet内网视频会议助力企业高效会议

在企业内部沟通与协作中&#xff0c;视频会议成为了一种必不可少的沟通方式。然而&#xff0c;传统的互联网视频会议往往受制于网络不稳定因素&#xff0c;给企业带来不便与困扰。WorkPlus Meet作为一款专注内网视频会议的软件&#xff0c;致力于为企业打造高效、稳定的内网视频…

Vue 3 响应式对象:ref 和 reactive 的使用和区别

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是尘缘&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f449;点击这里&#xff0c;就可以查看我的主页啦&#xff01;&#x1f447;&#x…

【HarmonyOS】服务卡片 API6 JSUI跳转不同页面并携带参数

【关键字】 服务卡片、卡片跳转不同页面、卡片跳转页面携带参数 【写在前面】 本篇文章主要介绍开发服务卡片时&#xff0c;如何实现卡片点击跳转不同页面&#xff0c;并携带动态参数到js页面。在此篇文章“服务卡片 API6 JSUI跳转不同页面”中说明了如果跳转不同页面&#xf…

[架构之路-250/创业之路-81]:目标系统 - 纵向分层 - 企业信息化的呈现形态:常见企业信息化软件系统 - 企业内的数据与数据库

目录 一、数据概述 1.1 数据 1.2 企业信息系统的数据 1.3 大数据 1.4 数据与程序的分离思想 1.5 数据与程序的分离做法 1.6 数据库的基本概念 1.7 企业数据来源 1.8 企业数据架构 二、常见的数据库类型 2.1 数据库分类 2.1 数据库类型 2.2 常见的数据库类型、应用…

【华为】路由器以PPPoE拨号接入广域网

组网需求 用户希望以PPPoE拨号方式接入广域网&#xff0c;如图1所示&#xff0c;Router作为PPPoE客户端&#xff0c;得到PPPoE服务器的认证后获得IP地址&#xff0c;实现用户接入互联网的需求。内网网关地址&#xff08;即VLANIF1接口的IP地址&#xff09;为10.137.32.1/24。 …

Linux越学越头疼,我要怎么办?

最近&#xff0c;听到一些同学说&#xff0c;“Linux越学越头疼”。其实这句话&#xff0c;在我之前刚接触Linux的时候&#xff0c;也是深有感触。Linux越学越不明所以。最后干脆放弃学习&#xff0c;转而学习其他东西。 其实大家在初学Linux的时候&#xff0c; 有这个感受&am…

[迁移学习]DA-DETR基于信息融合的自适应检测模型

原文标题为&#xff1a;DA-DETR: Domain Adaptive Detection Transformer with Information Fusion&#xff1b;发表于CVPR2023 一、概述 本文所描述的模型基于DETR&#xff0c;DETR网络是一种基于Transformer的目标检测网络&#xff0c;详细原理可以参见往期文章&#xff1a;…

微信视频号怎么下载视频,教你一键提取的方法!

今日小众冷门主题来袭&#xff01;居然还有人不知道怎么下载微信视频号的视频&#xff1f;快来跟着我一起学习吧&#xff01; 首先&#xff0c;我们要讨论的是微信视频号。这是一个近年来越来越受欢迎的平台&#xff0c;你可以在上面找到各种有趣的视频内容。但是&#xff0c;…

YOLOv5 - yolov5s.yaml 文件

基于深度学习的目标检测模型的结构:输入->主干->脖子->头->输出。主干网络提取特征&#xff0c;脖子提取一些更复杂的特征&#xff0c;然后头部计算预测输出。 YOLOv5网络结构主要由以下几部分组成: 骨干网络(Backbone) &#xff1a;Backbone:骨干网络&#xff0c…

求解一个整数中含多少个1

1.问题描述&#xff1a;给定一个整数&#xff0c;统计其对应的二进制中含有1的个数。比如8(0000 1000),对应的二进制数中&#xff0c;只含有一个1. 2.设计思路&#xff1a;对x取余&#xff1a;zx%2。如果z&#xff01;0&#xff0c;说明x的末尾不是为1.对于一个二进制x4x3x2x1…

提升ChatGPT答案质量和准确性的方法Prompt engineering

文章目录 怎么获得优质的答案设计一个优质prompt的步骤:Prompt公式:示例怎么获得优质的答案 影响模型回答精确度的因素 我们应该知道一个好的提示词,要具备一下要点: 清晰简洁,不要有歧义; 有明确的任务/问题,任务如果太复杂,需要拆分成子任务分步完成; 确保prompt中…

JAVA 实现PDF转图片(spire.pdf.free版)

1.引入jar包 导入方法1&#xff1a; 手动引入。将Free Spire.PDF for Java下载到本地&#xff0c;解压&#xff0c;找到lib文件夹下的Spire.PDF.jar文件。在IDEA中打开如下界面&#xff0c;将本地路径中的jar文件引入Java程序&#xff1a; 导入方法2&#xff1a;如果您想通过…

百度 | 文心一言也开始收费了

好久没用文心一言了 之前一直用ChatGPT的 今天打开文心一言一看&#xff0c;好家伙 出了文心大模型4.0&#xff0c;想体验一下来着 可惜是收费的 看下价格&#xff0c;没买 50块钱一个月&#xff0c;对比ChatGPT4来说&#xff0c;确实不算贵 毕竟gpt4一个月20美刀 &#xff0c;…

MySQL数据库干货_16—— SQL99标准中的查询

SQL99标准中的查询 MySQL5.7 支持部分的SQL99 标准。 SQL99中的交叉连接(CROSS JOIN) 示例&#xff1a; 使用交叉连接查询 employees 表与 departments 表。 select * from employees cross join departments;SQL99中的自然连接(NATURAL JOIN) 自然连接 连接只能发生在两…

多测师肖sir_高级金牌讲师_性能指标

性能指标 一、性能测试指标 性能测试是通过测试工具模拟多种正常、峰值及异常负载条件来对系统的各项性能指标进行测试。 目的&#xff1a;验证软件系统是否能够达到用户提出的性能指标&#xff0c;发现系统中存在的性能瓶颈并加以优化。 二、指标分为两大类&#xff1a; 软件…