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, jsonify
    
    app = 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 blue
      
      
      def 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'
    

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS UI 开发

引言 HarmonyOS 提供了强大的 UI 开发工具和组件&#xff0c;使开发者能够创建吸引人的用户界面。本章将详细介绍在 HarmonyOS 中应用 JS、CSS、HTML&#xff0c;HarmonyOS 的 UI 组件以及如何自定义 UI 组件。 目录 JS、CSS、HTML 在 HarmonyOS 中的应用HarmonyOS 的 UI 组…

谷歌推出基于AI的产品图像生成工具;[微软免费课程:12堂课入门生成式AI

&#x1f989; AI新闻 &#x1f680; 谷歌推出基于AI的产品图像生成工具&#xff0c;帮助商家提升广告创意能力 摘要&#xff1a;谷歌推出了一套基于AI的产品图像生成工具&#xff0c;使商家能够利用该工具免费创建新的产品图像。该工具可以帮助商家进行简单任务&#xff08;…

基于单片机的智能感应监控系统的设计

收藏和点赞&#xff0c;您的关注是我创作的动力 文章目录 概要 一、系统分析2.1 整个控制系统的设计要求2.2 总体设计方案 二、系统硬件电路设计3.1 硬件电路介绍3.2 控制电路分析3.2.1 复位电路 三 软件设计原理图 四、 结论五、 文章目录 概要 因为人们在生活中对安全防范的…

OpenGL ES入门教程(二)之绘制一个平面桌子

OpenGL ES入门教程&#xff08;二&#xff09;之绘制一个平面桌子 前言0. OpenGL绘制图形的整体框架概述1. 定义顶点2. 定义着色器3. 加载着色器4. 编译着色器5. 将着色器链接为OpenGL程序对象6. 将着色器需要的数据与拷贝到本地的数组相关联7. 在屏幕上绘制图形8. 让桌子有边框…

vue:js中合并对象的方法

目前比较常用的一共有三种 1、使用object.assign() 它可以将一个或多个对象的属性复制到目标对象中&#xff0c;第一个参数就是目标对象&#xff0c;这里举个例子&#xff1a; <template><div>{{data}}</div> </template> <script> export de…

Unity中Shader的烘培分支的判断

文章目录 前言一、上一篇文章中所需要的 lightmapUV 只有在烘焙时才会使用1、查看帮助文档后&#xff0c;Unity中判断烘培是否开启&#xff0c;使用的是LIGHTMAP_ON2、我们在 appdata 和 v2f 中&#xff0c;定义第二套UV 前言 Unity中Shader的烘培分支的判断&#xff0c;基于上…

服务器数据恢复—EMC存储pool上数据卷被误删的数据恢复案例

服务器数据恢复环境&#xff1a; EMC Unity某型号存储&#xff0c;连接了2台硬盘柜。2台硬盘柜上创建2组互相独立的POOL&#xff0c;2组POOL共有21块520字节硬盘。21块硬盘组建了2组RAID6&#xff0c;1号RAID6有11块硬盘. 2号RAID6有10块硬盘。 服务器故障&检测&#xff1…

扩容一个新节点

1.删除nodes rm -rf nodes/ 2.挂载本地文件与创建节点 bash build_chain.sh -f ipconf -e /root/tools/fisco-bcos 3.部署节点 bash nodes/127.0.0.1/start_all.sh 4.把共享的gen_node_cert.sh文件下载到本地 cp /root/Desktop/共享文件夹/tools/gen_node_cert.sh ./…

代码生成器

Easycode Entity ##导入宏定义 $!{define.vm}##保存文件&#xff08;宏定义&#xff09; #save("/entity", ".java")##包路径&#xff08;宏定义&#xff09; #setPackageSuffix("entity")##自动导入包&#xff08;全局变量&#xff09; $!{au…

链表详讲(附代码)

1.什么是链表 链表是一种非常常见的数据结构&#xff0c;在程序设计中经常被使用。它由一系列节点组成&#xff0c;每个节点都有用来存放数据的数据区以及存放下一个节点地址指针的地址区。跟顺序表不同的是&#xff0c;链表的节点之间的空间并非是连续的&#xff0c;依靠地址区…

【python VS vba】(5) 在python中使用xlwt操作Excel(待完善ing)

目录 1 什么是xlwt 2 导入xlwt 3 相关语法 3.1 创建新的workbook 3.2 创建新的sheet 3.3 保存workbook 4 python里表格的形式 4.1 矩阵 4.2 EXCEL的数据形式 完全等于矩阵的数字结构 4.3 python里矩阵 5 具体代码 5.1 代码 5.2 结果 5.3 要注意的问题 5.3.1 不能…

STL-set和map

目录 一、pair和make_pair 1. pair 2. make_pair 二、set &#xff08;一&#xff09;set的模板参数列表 &#xff08;二&#xff09;set的构造 &#xff08;三&#xff09;set的插入 1. 测试1 2. 测试2 &#xff08;四&#xff09;low_bound和upper_bound&#xff…

(四)docker:为mysql和java jar运行环境创建同一网络,容器互联

看了很多资料&#xff0c;说做互联的一个原因是容器内ip不固定&#xff0c;关掉重启后如果有别的容器启动&#xff0c;之前的ip会被占用&#xff0c;所以做互联创建一个网络&#xff0c;让几个容器处于同一个网络&#xff0c;就可以互联还不受关闭再启动ip会改变的影响&#xf…

ArcGIS for Android 禁止地图旋转

ArcGIS for Android 禁止地图旋转 话不多说&#xff0c;直接上代码&#xff01;&#xff01;&#xff01; public class LoadMap extends AppCompatActivity {// 地图private MapView mapView;private ArcGISMap map;Overrideprotected void onCreate(Bundle savedInstanceSta…

Ubuntu 系统内核 kernel panic

Ubuntu 系统内核 kernel panic 不能进入系统&#xff1a;报错end kernel panic -not syncing: attemped to kill init! exit code 0x00000100 系统启动的时候&#xff0c;按下‘e’键进入grub编辑界面&#xff0c;编辑grub菜单&#xff0c;选择“kernel /vmlinuz-XXXXro root…

听听ChatGPT对IT行业的发展和就业前景的看法

&#x1f308;个人主页: Aileen_0v0&#x1f525;系列专栏:PYTHON学习系列专栏&#x1f4ab;"没有罗马,那就自己创造罗马~" 目录 (1)判断素数 写法1: 写法2: (2)计算1-100的偶数之和 写法1: 写法2: (3)计算1-100的奇数之和 (4)多层循环 IT行业哪个方向比较…

k8s 多网卡方案multus

kubernetes 多网卡方案之 Multus_CNI 部署以及基本使用 一、multus cni 出现的背景 在k8s的环境中启动一个容器&#xff0c;默认情况下只存在两个虚拟网络接口&#xff08;loopback 和 eth0&#xff09;&#xff0c; loopback 的流量始终都会在本容器内或本机循环&#xff0c…

【中国知名企业高管团队】系列57:康佳KONKA

今天开始&#xff0c;华研荟为大家介绍中国电视行业的知名企业&#xff0c;接下来三天介绍位于深圳的电视三巨头&#xff0c;这三巨头以电视机研发、生产和销售起步&#xff0c;2000左右生产过非智能手机&#xff0c;但是在互联网时代被小米们抢走了电视和手机的很大一部分市场…

【音视频 | opus】opus编解码库(opus-1.4)详细介绍以及使用——附带解码示例代码

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

《动态顺序表》的实现

目录 前言&#xff1a; 认识线性表&#xff1a; 关于顺序表 实现动态顺序表&#xff1a; 顺序表的动态存储定义&#xff1a; 初始化顺序表&#xff1a; 顺序表的销毁&#xff1a; 尾插&#xff1a; 判断是否需要扩容&#xff1a; 总代码&#xff1a; 头插&#xff1a…