flask--初学day1

本文介绍了 Flask 框架的基本概念,包括其核心组件 werkzeug 和 Jinja2,以及与其他 web 框架的对比。详细讲解了 Flask 的环境安装,特别是虚拟环境的设置。接着,文章涵盖了 Flask 1.x 版本的新启动方式,包括终端命令和 PyCharm 中的配置。此外,还讨论了 Flask 的路由定义、路径参数类型和处理不同类型的请求方法。
摘要由CSDN通过智能技术生成

1.Flask认识

  • Flask核心:werkzeug(路由分发)和Jinja2(模板渲染),轻量级的web框架;
    • 如果只安装Flask,都没有ORM(无法操作数据库),后台管理等;

2.框架对比

  • 如何选择web框架?
    • 1.开发周期:要求进度快,建议选择django;
    • 2.功能需求:比较复杂,需要使用各种第三方或是自己实现的工具,建议使用Flask;
    • 3.后期维护:如果迭代不是特别频繁,建议选择django;
    • 4.熟悉程度:自己对各种框架的熟悉程度;

3.环境安装:

  • 虚拟环境:独立于真实系统环境外,拥有独立的python解释器和依赖包;
# 创建虚拟环境、进入、退出等指令,不是Linux系统自带的指令;
# 需要安装工具包才能使用,配置环境变量
pip install virtualenv
pip install virtualenvwrapper
# 安装成功,且配置环境变量后,才能使用workon/rmvirtualenv等指令

# 安装过程中,如果遇到报红OSError,网络不好或网络不通,测试网络是否畅通,多次尝试重新安装

# 创建py3的解释器虚拟环境,需要联网安装,
mkvirtualenv -p python3 sy_py33
# 安装Flask并指定版本,如未指定,默认安装最新版
pip install flask==1.0.2

# 其它指令,卸载安装包,退出虚拟环境,移除虚拟环境
pip uninstall flask
deactivate
rmvirtualenv 虚拟环境名称

4.基本程序

from flask import Flask

# 步骤:
# 1.导入Flask类(项目名称和py文件名,禁止使用标准模块名,比如:random、json,或是flask)
# 2.创建程序实例app
# 3.使用程序实例app,定义路由和视图
# 4.启动服务器

app = Flask(__name__)

@app.route('/')
def index():
    return 'hello world'

if __name__ == '__main__':
    # Flask默认是5000端口,
    # 如果修改端口port参数
    # 七行代码本质:实现了web服务器
    app.run(port=8000)


  • run方法参数
    # 参数:host、port、debug
    # 1、host表示主机,当前系统内,默认127.0.0.0,
    # 127.0.0.1和0.0.0.0区别?
    # 127表示本机回环地址,当前系统外无法访问;比如:在虚拟机中运行项目,只能虚拟机内访问,win系统无法访问;
    # 0.0表示任意ip,当前系统外可以访问,比如:在虚拟机中运行项目,虚拟机内可以访问,win系统访问可以通过访问虚拟机的真实ip,访问项目;
    # 2、port表示端口,当前系统内,区分不同的应用;

    # 3、debug表示调试模式,
    # 3.1自动跟踪代码的变化,不需要手动重启
    # 3.2帮助定位错误信息
    # 3.3只能在开发环境下使用,线上项目禁止使用
    app.run(host='0.0.0.0',port=8000,debug=True)

5.Flask1.x版本的新启动方式

  • 两种启动方式:本质是相同的
    • 1.通过终端(系统终端或是pycharm终端)命令:
      • 1.1需要添加环境变量,
        • export FLASK_APP=启动文件名
        • export FLASK_ENV=development/production
      • 1.2启动项目:flask run
    • 2.使用pycharm软件:
      • 2.1pycharm中选择编辑配置信息,选择module-name,配置环境变量,启动项目
      • 2.2旧版本pycharm软件,需要删除script-path中内容,直接在parmeters中-m flask run配置,配置环境相同;

6.路由信息

  • 定义方式:route方法
from flask import Flask

app = Flask(__name__)

# 路由:
# 1.url路径必须以斜线开始

# 404找不到
# http://127.0.0.1:5002/

# http://127.0.0.1:5002/abc
@app.route('/abc',methods=['POST'])
def index2019():
    return 'hello 2019'
# http://127.0.0.1:5002/static/index.html

# AssertionError: View function mapping is overwriting an existing endpoint function: index2020
# 视图函数重名了

@app.route('/abc',methods=['GET'])
def index2020():
    return 'hello 2020'


if __name__ == '__main__':
    # 打印所有的路由规则,路由映射
    print(app.url_map)
    app.run(port=5002)

"""
Map(
    [
      <Rule '/123' (HEAD, OPTIONS, GET) -> index>,
      Flask默认创建的静态路由,作用是方便访问静态文件;
      <Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>
    ]
  )
Map:类、列表、列表容器,存储了所有的路由信息;
相当于django中urls.py文件中urlpattern
Rule:类、规则,url路径、请求方法和视图函数名的映射(指向)关系;

url路径的匹配:先匹配路径,再匹配请求方法,满足条件,执行对应的视图;
从上到下依次匹配,如匹配成功,不会继续匹配;

"""

7.路径参数

from flask import Flask

app = Flask(__name__)
# Flask中url路径中的尖括号,叫做转换器,本质是正则表达式

# 路由变量:路径参数,url路径的一部分,必须要有
# http://127.0.0.1:5002/13012345678
# 查询参数:查询字符串,在url中可有可无,问号后面,与号分隔,等号传值;
# http://127.0.0.1:5002/?mobile=13012345678&user_id=1001

# 基本语法:<参数名>,必须作为视图函数的参数传给视图
@app.route('/<temp>')
def index(temp):
    return 'hello world %s' % temp

if __name__ == '__main__':
    print(app.url_map)
    app.run(port=5003)
  • Flask内置6种转换器:
    • string、int、float、any、path、uuid
from flask import Flask
# Flask的核心werkzeug中的路由模块中,有转换器源码
from werkzeug.routing import BaseConverter

app = Flask(__name__)
# Flask中url路径中的尖括号,叫做转换器,本质是正则表达式

# 路由变量:路径参数,url路径的一部分,必须要有
# http://127.0.0.1:5002/13012345678
# 查询参数:查询字符串,在url中可有可无,问号后面,与号分隔,等号传值;
# http://127.0.0.1:5002/?mobile=13012345678&user_id=1001

# 基本语法:<参数名>,必须作为视图函数的参数传给视图
# 默认的是unicodeconverter,兼容数值、字符串;
# 限制路径参数的数据类型,int、float

"""
import re
# 正则执行多次,需要要编译多次
re.findall('\d',data) 
re.match('\d',data) 
# 只需要编译一次,多次执行,正则的效率比直接使用findall和match要高
com = re.compile('\d')
com.match()

"""
@app.route('/<int:temp>')
def index(temp):
    return 'hello world %s' % temp

if __name__ == '__main__':
    print(app.url_map)
    app.run()
  • 自定义转换器
from werkzeug.routing import BaseConverter
app = Flask(__name__)

# 需求:匹配url路径中的参数,手机号
# http://127.0.0.1:5004/mobile/13012345678
"""
实现步骤:
1、定义类,需要继承自基础转换器
2、定义属性,正则表达式,regex
3、把自定义的转换器类,添加到默认的转换器字典容器中

"""

class MobileConverter(BaseConverter):
    regex = '1[3-9]\d{9}'

app.url_map.converters['re_mobile'] = MobileConverter

# 使用自定义的转换器
@app.route('/mobile/<re_mobile:mobile>')
def index(mobile):
    return 'hello world {}'.format(mobile)

8.处理请求

  • request:请求上下文对象,处理请求信息
    • 常用属性:args/form/data/files/cookies/json等
@app.route('/',methods=['GET','POST'])
def index():
    # 1----args,表示查询字符串
    # http://127.0.0.1:5003/?mobile=13012345678&user_id=2020
    # mobile=13012345678,user_id=2020
    # mobile = request.args.get('mobile')
    # user_id = request.args.get('user_id')
    # print('mobile={},user_id={}'.format(mobile,user_id))

    # 2----form,表示表单参数
    # mobile = request.form.get('mobile')
    # pswd = request.form.get('pswd')
    # print('mobile={},pswd={}'.format(mobile,pswd))

    # 3----json,表示json数据
    # user = request.json.get('user')
    # pswd = request.json.get('pswd')
    # print('user={},pswd={}'.format(user,pswd))

    # 4----url/method
    # print('*'*50)
    # print(request.url)
    # print(request.method)
    # print('*'*50)

    # 5----headers,请求头信息
    print('*'*60)
    print(request.headers)
    print('*'*60)

    # 6----files,表示文件
    # 使用postman传文件时,如果后台无法保存文件
    # 一定要把Content-Type删掉;
    image = request.files.get('image')
    # 保存文件,with open("666.jpg","wb")
    image.save('./666.jpg')

    return 'hello world'

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值