1.创建一个虚拟环境并安装flask命令如下:
conda create -n flask python=3.8 flask==1.1.4 # 如果报错,执行以下步骤:
使用国内镜像源:
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
# TUNA的help中镜像地址加有引号,需要去掉
# 设置搜索时显示通道地址
conda config --set show_channel_urls yes
再执行第一步即可. 如果还报错,可以先创建虚拟环境,然后再在虚拟环境中安装flask即可.
conda 相关命令
conda activate <虚拟环境名称> # 进入/切换到指定名称的虚拟环境,如果不带任何参数,则默认回到全局环境base中。
conda deactivate # 退出虚拟环境
conda env list # 查看当前都有哪些虚拟环境
2. 创建项目目录
mkdir flaskdemo
3. 使用pycharm打开新建的项目目录,删除main.py文件,
注意点!
manage.py启动文件代码:
from flask import Flask app = Flask(__name__) @app.route(‘/‘) def index(): return ‘Hello World‘ if __name__ == ‘__main__‘: app.run()
运行结果:
以上代码解析:
# 导入Flask类 from flask import Flask """ import_name Flask程序所在的包(模块),传 __name__ 就可以 其可以决定 Flask 在访问静态文件时查找的路径 static_path 静态文件访问路径(不推荐使用,使用 static_url_path 代替) static_url_path 静态文件访问路径,可以不传,默认为:/ + static_folder static_folder 静态文件存储的文件夹,可以不传,默认为 static template_folder 模板文件存储的文件夹,可以不传,默认为 templates """ app = Flask(import_name=__name__) # 编写路由视图 # flask的路由是通过给视图添加装饰器的方式进行编写的。当然也可以分离到另一个文件中。 # flask的视图函数,flask中默认允许通过return返回html格式数据给客户端。 @app.route(‘/‘) def index(): return "<h1>hello world</h1>" # 加载项目配置 class Config(object): # 开启调试模式 DEBUG = True # flask中支持多种配置方式,通过app.config来进行加载,我们会这里常用的是配置类 app.config.from_object( Config ) # 指定服务器IP和端口 if __name__ == ‘__main__‘: # 运行flask app.run(host="0.0.0.0", port=5000)
路由参数
路由的基本定义
路由和视图的名称必须全局唯一,不能出现重复,否则报错。
路由参数就是url路径的一部分。
# 路由传递参数[没有限定类型] @app.route(‘/user/<user_id>‘) def user_info(user_id): return ‘hello %s‘ % user_id
DEFAULT_CONVERTERS = { "default": UnicodeConverter, "string": UnicodeConverter, "any": AnyConverter, "path": PathConverter, "int": IntegerConverter, "float": FloatConverter, "uuid": UUIDConverter, }
描述 string 默认类型,接受不带斜杠的任何文本 int 接受正整数 float 接受正浮点值 path 接收 string
但也接受斜线uuid
# 限定类型传递路由参数 # flask内置的所有路由转换器是由werkzeug.routing的DEFAULT_CONVERTERS字典进行配置的。 # flask的所有路由转换器,本质上就是路由经过正则来进行匹配获取参数值的。所有的路由转换器都必须直接或间接继承于BaseConverter路由转换器基类 @app.route("/sms/<int(min=10,max=100):mobile>") def sms(mobile): return f"mobile={mobile}"
也叫正则匹配路由参数.
在 web 开发中,可能会出现限制用户访问规则的场景,那么这个时候就需要用到正则匹配,根据自己的规则去限定请求参数再进行访问
具体实现步骤为:
导入转换器基类:在 Flask 中,所有的路由的匹配规则都是使用转换器对象进行记录
自定义转换器:自定义类继承于转换器基类BaseConverter
添加转换器到默认的转换器字典中
使用自定义转换器实现自定义匹配规则
导入转换器基类
from werkzeug.routing import BaseConverter
自定义转换器
# 自定义正则转换器
from werkzeug.routing import BaseConverter
class RegexConverter(BaseConverter):
def __init__(self,map,*args):
super().__init__(map)
# 正则参数
self.regex = args[0]
添加转换器到默认的转换器字典中,并指定转换器使用时名字为: re
# 将自定义转换器添加到转换器字典中,并指定转换器使用时名字为: re
app.url_map.converters[‘re‘] = RegexConverter
使用转换器去实现自定义匹配规则
当前此处定义的规则是:手机号码
# 自定义路由转换器
from werkzeug.routing import BaseConverter
?
class RegexConverter(BaseConverter):
def __init__(self,map,*args):
super().__init__(map)
# 正则参数
self.regex = args[0]
?
# 将自定义转换器添加到转换器字典中,并指定转换器使用时名字为: re
app.url_map.converters[‘re‘] = RegexConverter
?
# 正则匹配路由
运行测试:http://127.0.0.1:5000/login/1311111111 ,如果访问的url不符合规则,会提示找不到页面
from flask import Flask,request # 初始化 app = Flask(import_name=__name__) # 编写路由视图 @app.route(rule=‘/‘) def index(): return "<h1>hello world!</h1>" # 关于路由参数的限制,flask内置的类型不够具体,在开发中,我们经常接受参数,需要更加精确的限制 # 这时候,可以使用正则匹配路由参数 # 正则匹配路由参数,其实就是扩展flask内置的路由限定类型,需要完成4个步骤 # 1. 引入flask的路由转换器 from werkzeug.routing import BaseConverter # 2. 创建自定义路由转换器 class MobileConverter(BaseConverter): """手机号码类型限制""" def __init__(self,map,*args): super().__init__(map) self.regex = "1[3-9]\d{9}" # 3. 把自定义转换器添加到flask默认的转换器字典中,也就是和原来的int,float等放在一块 app.url_map.converters[‘mob‘] = MobileConverter # 4. 类似原来的路由参数限制一样,调用自定义转换器名称即可 @app.route(rule=‘/user/<mob:mobile>‘) def user(mobile): return mobile # 1. 引入flask的路由转换器 from werkzeug.routing import BaseConverter # 2. 创建自定义路由转换器 class RegexConverter(BaseConverter): """根据正则进行参数限制""" def __init__(self,map,*args): super().__init__(map) self.regex = args[0] # 3. 把自定义转换器添加到flask默认的转换器字典中,也就是和原来的int,float等放在一块 app.url_map.converters[‘re‘] = RegexConverter # 4. 类似原来的路由参数限制一样,调用自定义转换器名称即可 @app.route(rule=‘/user/<re("\w+@\w+\.\w+"):email>‘) def user2(email): print(app.url_map) # 获取所有的路由列表 return email # 声明和加载配置 class Config(): DEBUG = True app.config.from_object(Config) if __name__ == ‘__main__‘: # 运行flask app.run(host="0.0.0.0")
from flask import Flask,request # 限制客户端的http请求方法,注意这里与django不一样,flask并没有默认没有内置csrf攻击防范 @app.route(rule="/user", methods=["post","put","get","delete","patch"]) def user(): # 例如:地址栏中通过 http://127.0.0.1:5000/user?user=1 返回本视图 print(request.method) # 获取本次客户端的http请求方法 GET print(request.query_string) # 获取本次客户端的查询字符串 b‘user=1‘ print(request.path) # 获取本次客户端请求的路由路径部分[去掉域名端口] /user print(request.url) # 获取本次客户端请求的http url地址 http://127.0.0.1:5000/user?user=1 # 直接从请求中取到请求方式并返回 return request.method
原文:https://www.cnblogs.com/xo1990/p/14806269.html