Flask入门一(介绍、Flask安装、Flask运行方式及使用、虚拟环境、调试模式、配置文件、路由系统)
文章目录
- 一、Flask介绍
- 二、Flask创建和运行
-
- 1.安装
- 2.快速使用
- 3.Flask小知识
- 4.flask的运行方式
- 三、Werkzeug介绍
- 四、Jinja2介绍
- 五、Click CLI 介绍
- 六、Flask安装
-
- 介绍
- watchdog使用
- python–dotenv使用(操作环境变量)
- 七、虚拟环境
-
- 介绍
- Mac/linux创建虚拟环境
- Win创建虚拟环境
- 八、Flask的debug模式(调试)
- 九、fastapi小案例(快速了解)
- 十、显示用户小案例
- 十一、Flask配置文件
-
- 配置方式
- 默认配置文件
- 补充
- 十二、路由系统
-
- 路由的典型写法
- 路由中的默认转换器
- 路由本质
- Add_url_rule的参数
一、Flask介绍
Flask是一个基于Python开发并且
依赖jinja2模板
和Werkzeug WSGI服务
的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器
“微”(micro)
并不表示你需要把整个 Web 应用塞进单个 Python 文件(虽然确实可以),也不意味着 Flask 在功能上有所欠缺。微框架中的“微”意味着 Flask 旨在保持核心简单而易于扩展
。Flask 不会替你做出太多决策——比如使用何种数据库。而那些 Flask 所选择的——比如使用何种模板引擎——则很容易替换。除此之外的一切都由可由你掌握
默认情况下,Flask 不包含数据库抽象层、表单验证,或是其它任何已有多种库可以胜任的功能。然而,Flask 支持用扩展来给应用添加这些功能,如同是 Flask 本身实现的一样。众多的扩展提供了数据库集成、表单验证、上传处理、各种各样的开放认证技术等功能。Flask 也许是“微小”的,但它已准备好在需求繁杂的生产环境中投入使用
Flask depends on the Werkzeug WSGI toolkit, the Jinja template engine, and the Click CLI toolkit
-Werkzeug WSGI:接收请求 django 中得 wsgiref-jinja2模板 :渲染模板的 django中得dtl-Click CLI :命令定制工具 django 的 manage.py runserver/migrate...
常用Python Web框架区别
'Python Web框架,本质都是一样的'1.Django:大而全,内置的app多,第三方app也多,django3.x也支持异步操作了-自带的应用:admin后台管理、auth身份鉴权、sessions会话管理....-第三方app:Django Rest Framework、Django CORS Headers 、Django Bootstrap....2.Flask:小而精,没有过多的内置组件,只有完整的web框架最基本的功能,需要借助于第三方完成更丰富的功能-众多第三方:比如orm咱们会用sqlalchemy,peewee....3.fastapi:python的异步web框架,跟flask相似,也只保留了web开发的核心功能,其他需要借助第三方实现-异步框架-更方便的使用ppython async和await关键字来实现异步操作4.sanic:python的异步web框架,供支持异步高并发请求的 web 服务
同步框架和异步框架的区别
1.djagno是同步框架还是异步框架,djagno 3.x以后支持异步2.同步框架:一个线程只处理一个请求3.异步框架:一个线程可以处理多个请求4.异步框架可以很显著的提高并发量django的并发量是指usgi的线程数,线程的并发量就是协程,同步框架和异步框架对于用户来说,消耗的时间是一个样的。但异步框架的效率提高了。
二、Flask创建和运行
1.安装
pip install flask'安装完成后,会在script目录下多flask.exe 命令,后期运行flask需要使用它'
2.快速使用
from flask import Flask1.实例化得到对象app = Flask(__name__)2.注册路由,写视图函数@app.route('/') # 根路径def index():return 'hello world'if __name__ == '__main__':# 运行app,默认运行在5000# 默认是host='127.0.0.1', port=5000端口app.run()'运行后http://127.0.0.1:5000访问这个地址,即可看到hello,world了'
3.Flask小知识
1.注册路由app.route(路径,method=[请求方式get,post])2.新手四件套:-render_template 渲染模板 跟django有区别-redirect 重定向-return 字符串 返回字符串---jsonify格式字符串3.请求的request对象,是全局的request对象,直接导入使用即可,在不同的视图函数不会混乱request.method 请求方式request.form post请求的body体的内容转换成了字典4.session 全局的直接导入使用即可,一定要指定秘钥app.secret_key='shashoashofisj'放值:session['name']='kimi'取值: session.get('name')5.模板的渲染-兼容django的dtl-更强大,可以加括号,字典取值多样(dict.get('')/dict['']/dict./dict.items()),而django只能dict.-{% for %}6.转换器@app.route('/detail/<int:pk>')
4.flask的运行方式
'运行项目方式'-方式一(pycharm配置):-新建一个flask-server---》配置选中 script---》有app的文件-方式二:命令(推荐这种)flask --app py文件名字 runflask --app 5-flask再体验.py run-方式三:命令python38 -m flask --app py文件名字 runpython38 -m flask --app 5-flask再体验.py run-方式四,右键运行if __name__ == '__main__':app.run()-方式五:命令运行(跟右键运行一样)python38 5-app.py- 方式六:少用(pip install python-dotenv)flask app run
三、Werkzeug介绍
Werkzeug是一个WSGI工具包
,他可以作为一个Web框架的底层库。这里稍微说一下, werkzeug 不是一个web服务器,也不是一个web框架,而是一个工具包
,官方的介绍说是一个 WSGI 工具包,它可以作为一个 Web 框架的底层库,因为它封装好了很多 Web 框架的东西,例如 Request,Response 等等
Werkzeug is a comprehensive WSGI web application library. It began as a simple collection of various utilities for WSGI applications and has become one of the most advanced WSGI utility libraries.
Werkzeug 是一个综合性 WSGI Web 应用程序库。它最初是 WSGI 应用程序的各种实用程序的简单集合,现已成为最先进的 WSGI 实用程序库之一。
Werkzeug doesn’t enforce any dependencies. It is up to the developer to choose a template engine, database adapter, and even how to handle requests
Werkzeug 不强制执行任何依赖关系。由开发人员选择模板引擎、数据库适配器,甚至如何处理请求
官方网址:https://werkzeug.palletsprojects.com/en/3.0.x/
django--->wsgiref ,uwsgiflask---->Werkzeugdjango或flask--》都需要有web服务器---》web服务器需要符合 wsgi协议-规定了,框架是一个可调用对象,请求来了,wsgi服务器调用这个对象的时候,会传入 两个参数environ,start_response-flask中能找到这两个参数,django中也能找到这两个参数后期:测试django项目,使用wsgiref,上线djagno项目,使用uwsgi,gunicorn测试flask项目,使用werkzeug,上线flask项目,使用uwsgi,gunicorn1 写了一个可调用对象,可以使用符合wsig协议的web服务器来调用,执行它def application(environ, start_response):start_response('200 OK', [('Content-Type', 'text/plain')])return ['Hello World!'.encode('utf-8')]2 使用符合wsgi协议的web服务器调用它from wsgiref.simple_server import make_server# 咱们这个application 函数,它就是 django框架或flask框架def application(environ,start_response):print(environ)start_response('200 OK', [('Content-Type', 'text/html')])# 只有是html的才会把代码渲染,否则就是当成字符串展示到页面if environ.get('PATH_INFO') == '/index':with open('index.html', 'rb') as f:data = f.read()elif environ.get('PATH_INFO') == '/login':with open('login.html', 'rb') as f:data = f.read()else:data = b'<h1>Hello, web!</h1>'return [data]if __name__ == '__main__':myserver = make_server('',8011,application)print('监听8011端口')myserver.serve_forever()3 使用werkzeug 运行 application# 有了 Request和Response,路由分发,可以获取静态文件,可以返回html页面from werkzeug.wrappers import Request, Responsefrom werkzeug.serving import run_simpledef application(environ, start_response):request = Request(environ)text = f"Hello {request.args.get('name', 'World')}!"response = Response(text, mimetype='text/plain')return response(environ, start_response)if __name__ == '__main__':run_simple('localhost', 4000, application)
四、Jinja2介绍
Jinja is a fast, expressive, extensible templating engine. Special placeholders in the template allow writing code similar to Python syntax. Then the template is passed data to render the final document
Jinja
是一个快速、富有表现力、可扩展的模板引擎。模板中的特殊占位符允许编写类似于 Python 语法的代码。然后向模板传递数据以渲染最终文档
语法完全支持 dtl,但比dtl更强大
官方网址:https://jinja.palletsprojects.com/en/3.1.x/
五、Click CLI 介绍
Click is a Python package for creating beautiful command line interfaces in a composable way with as little code as necessary. It’s the “Command Line Interface Creation Kit”. It’s highly configurable but comes with sensible defaults out of the box
Click 是一个 Python 包,用于以可组合的方式使用尽可能少的代码创建漂亮的【命令行界面】。它是“命令行界面创建工具包”。它具有高度可配置性,但具有开箱即用的合理默认值
It aims to make the process of writing command line tools quick and fun while also preventing any frustration caused by the inability to implement an intended CLI API
它的目的是使编写命令行工具的过程变得快速而有趣,同时也防止因无法实现预期的 CLI API 而造成的任何挫败感
Click in three points:arbitrary nesting of commands automatic help page generationsupports lazy loading of subcommands at runtime Click三点:命令的任意嵌套自动生成帮助页面支持运行时延迟加载子命令
官方网址:https://click.palletsprojects.com/en/8.1.x/
# pip3 install clickimport click@click.command()@click.option('--count', default=1, help='Number of greetings.')@click.option('--name', prompt='Your name',help='The person to greet.')def hello(count, name):for x in range(count):click.echo(f"Hello {name}!")if __name__ == '__main__':hello()1 python app.py --count=3 # app.py是当前运行页py的名称# count=3循环三次2 python app.py --help3 python app.py --count=3 --name=jack
六、Flask安装
介绍
'最新版本,最低支持 python3.8'1 安装flask时,会自动安装一些其他模块1.Werkzeug implements WSGI, the standard Python interface between applications and servers. 运行服务2.Jinja is a template language that renders the pages your application serves. 模板MarkupSafe comes with Jinja. It escapes untrusted input when rendering templates to avoid injection attacks. 防止xss攻击3.ItsDangerous securely signs data to ensure its integrity. This is used to protect Flask’s session cookie. cookie加密4.Click is a framework for writing command line applications. It provides the flask command and allows adding custom management commands. 制定命令5.Blinker provides support for Signals. 信号2 这些依赖不会自动安装。如果您安装它们,Flask 将检测并使用它们# python-dotenv enables support for Environment Variables From dotenv when running flask commands.可以把key和value放到环境变量---》使用这个模块可以操作# Watchdog provides a faster, more efficient reloader for the development serverflask修改了代码,他会检测到并重新运行---》最新代码
watchdog使用
# pip install watchdog'当前目录下文件修改会被监控到,打印日志''例如创建新文件,删除,修改等都会记录日志'import sysimport timeimport loggingfrom watchdog.observers import Observerfrom watchdog.events import LoggingEventHandlerif __name__ == '__main__':logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(message)s',datefmt='%Y-%m-%d %H:%M:%S')path = sys.argv[1] if len(sys.argv) > 1 else '.'event_handler = LoggingEventHandler()observer = Observer()observer.schedule(event_handler, path, recursive=True)observer.start()try:while True:time.sleep(1)except KeyboardInterrupt:observer.stop()observer.join()
python–dotenv使用(操作环境变量)
官方网址:https://saurabh-kumar.com/python-dotenv/
# pip install python-dotenvimport osfrom dotenv import load_dotenvfrom dotenv import dotenv_values1 加载配置文件# 必须在根路径下新建一个 .env 的文件,并写入配置才能返回True,会把.env下的配置文件设置进环境变量# 配置按照key:value的形式 USERNAME=JACKres=load_dotenv() # take environment variables from .envprint(res)print(os.environ.get('DOMAIN'))print(os.environ.get('USERNAME'))print(os.environ.get('AGE'))# You will probably want to add .env to your .gitignore, especially if it contains secrets like a password.2 获取环境变量字典config = dotenv_values(".env")print(config)print(config.get('DOMAIN'))
七、虚拟环境
介绍
之前咱们学过适应第三方模块创建虚拟环境,python内置(venv)可以直接创建虚拟环境
Use a virtual environment to manage the dependencies for your project, both in development and in production.
在开发和生产中,使用虚拟环境来管理项目的依赖关系
What problem does a virtual environment solve The more Python projects you have, the more likely it is that you need to work with different versions of Python libraries, or even Python itself. Newer versions of libraries for one project can break compatibility in another project.
虚拟环境解决什么问题?您拥有的 Python 项目越多,您就越有可能需要使用不同版本的 Python 库,甚至是 Python 本身。一个项目的较新版本的库可能会破坏另一项目的兼容性。
Virtual environments are independent groups of Python libraries, one for each project. Packages installed for one project will not affect other projects or the operating system’s packages.
虚拟环境是一组独立的 Python 库,每个项目对应一个。为一个项目安装的软件包不会影响其他项目或操作系统的软件包
Python comes bundled with the venv module to create virtual environments.
Python 使用 venv 模块来创建虚拟环境
Mac/linux创建虚拟环境
'创建虚拟环境'mkdir myprojectcd myprojectpython3 -m venv .venv# 激活虚拟环境. .venv/bin/activate
Win创建虚拟环境
'创建虚拟环境'mkdir myprojectcd myprojectpy -3 -m venv .venv# 激活虚拟环境.venvScriptsactivate
八、Flask的debug模式(调试)
flask --app xxxx.py run --debug1 浏览器显示错误信息2 改了代码自动重启
九、fastapi小案例(快速了解)
官方网址:https://fastapi.tiangolo.com/zh/
安装:pip install fastapipip install uvicorn'具体查看官方文档即可'# from typing import Union # python 的内置--》数据校验import timefrom fastapi import FastAPIimport asyncioapp = FastAPI()@app.get("/")async def read_root():# 如果有ioawait asyncio.sleep(2)# time.sleep(10)return {"Hello": "World"}@app.get("/items/{item_id}")def read_item(item_id, q=None):return {"item_id": item_id, "q": q}# 天生自带接口文档----》方便我们快速写前后端分离的接口'运行:uvicorn fastapi快速了解.py:app'# 针对于io多的web后端,使用 异步框架,会提高性能# 咱们项目,基本都是io多,查询数据库,redis 都是io操作# 使用fastapi能提高并发量
十、显示用户小案例
app.py
from flask import Flask, render_template, request, redirect,session
app = Flask(__name__)
app.secret_key = 'dsakjfkls.fldsjalkfj.lksfjdal'# 常量--》写死用户信息
USERS = {1: {'name': '刘亦菲', 'age': 18, 'gender': '男', 'text': "刘亦菲,1987年8月25日出生于湖北省武汉市,华语影视女演员、歌手,毕业于北京电影学院2002级表演系本科",'img': 'https://img2.woyaogexing.com/2021/10/16/e3ccba623848430ba83209c0621a2256!400x400.jpeg'},2: {'name': '彭于晏', 'age': 28, 'gender': '男', 'text': "彭于晏,1982年3月24日出生于中国台湾省澎湖县,毕业于不列颠哥伦比亚大学,华语影视男演员。。。。。。。。",'img': 'https://img2.woyaogexing.com/2021/10/16/e71aa35728c34313bccb4c371192990f!400x400.jpeg'},3: {'name': '迪丽热巴', 'age': 38, 'gender': '女', 'text': "迪丽热巴(Dilraba),1992年6月3日出生于中国新疆乌鲁木齐市,毕业于上海戏剧学院,中国内地影视女演员",'img': 'https://img2.woyaogexing.com/2021/10/30/6a34146dde2d4f1c832463a5be1ed027!400x400.jpeg'},4: {'name': '亚瑟', 'age': 38, 'gender': '男', 'text': "亚瑟,是腾讯手游《王者荣耀》中一名战士型英雄角色,也是《王者荣耀》的新手英雄之一,既可攻又可守",'img': 'https://img2.woyaogexing.com/2021/10/30/371b2aa7a03c4f53b7b1bc86f877d7d1!400x400.jpeg'},
}@app.route('/login',methods=['GET','POST'])
def login():if request.method == 'GET':# 返回模板return render_template('login.html')else:# 取出用户名密码,判断# flask的request 没有POST,GET# request.form 就是 post# request.args 就是 GETusername = request.form.get('username')password = request.form.get('password')if username == 'jack' and password == '123':# 登录成功跳转到首页,并把登录信息写入到session中# 一旦使用session就必须指定密钥,secret_keysession['name']=username# return redirect('https://www.baidu.com')return redirect('/') # 重定向到首页else:return render_template('login.html', error='用户名密码错误')# 首页及其他分支页面需要登录后,才能访问,如果没有登录需跳转至登录页面
@app.route('/')
def index():if session.get('name'):return render_template('index.html',users=USERS)else:return redirect('/login')@app.route('/detail/<int:id>')
def detail(id):if session.get('name'):info = USERS.get(id)return render_template('detail.html',info=info)else:return redirect('/login')if __name__ == '__main__':app.run(debug=True)
login.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登录</title>
</head>
<body>
<form method="post"><p>用户名: <input type="text" name="username"></p><p>密码: <input type="password" name="password"></p><p><input type="submit" value="登录"><span>{{ errors }}</span></p>
</form>
</body>
</html>
index.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>{% for k,v in users.items() %}<div>id:{{ k }}</div><div><a href="/detail/{{ k }}">{{ v.name }}</a></div><div>{{ v['age'] }}</div><div>{{ v.get('gender') }}</div><div><img src="{{v.img}}" alt="" width="100px" height="100px"></div><hr>
{% endfor %}
</body>
</html>
detail.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h2>用户名称:{{ info.name }}</h2> <!--支持Django中的Dtl语法-->
<h2>用户年龄:{{ info.age }}</h2>
<h2>用户性别:{{ info.gender }}</h2>
<h3>用户信息:{{ info.text }}</h3></body>
</html>
登录装饰器
def auth(func):def inner(*args,**kwargs):if session.get('name'):res = func(*args,**kwargs)return reselse:return redirect('/login')return inner# 首页及其他分支页面需要登录后,才能访问,如果没有登录需跳转至登录页面# 使用登录装饰器# 必须路由匹配完---》执行视图函数之前,做判断--》路由的装饰器是控制路由匹配的--》需要先执行,所以登录认证装饰器,放在下面# 这样加了会报错---》每个路由,都会有个别名,如果不写,默认以函数名作为别名# 如果视图函数加了装饰器---》函数名就变成了 inner?--》所有视图函数,都叫inner,导致 路由别名冲突了# 1 装饰器加装饰器---wrapper装饰器--》改掉真正被装饰函数的名字# 2 直接指定路由别名@app.route('/',endpoint='index')@authdef index():return render_template('index.html',users=USERS)
十一、Flask配置文件
配置方式
from flask import Flask,jsonifyapp = Flask(__name__)1 方式一:放在app对象上,本质会放在 app.config 里面app.debug = Falseapp.secret_key = 'xxkjl.xxxlxkj.xxljafsdkljfs'print(app.config)2 方式二:放在app对象的config参数上app.config['DEBUG'] = True # key需要全大写app.config['HOST'] = '127.0.0..1' # 自己设置的配置app.config['DEBUG'] = True # 由于Config对象本质上是字典,所以还可以使用app.config.update(...)app.config.from_pyfile('python文件名称') # 使用本地配置文件app.config.from_envvar('环境变量名称') # 使用环境变量里面的信息app.config.from_json('json文件名称') # 必须为Json格式 因为内部会执行json.loadsapp.config.from_mapping({'DEBUG': True}) # 字典格式app.config.from_object('object / path') # python类或类的路径print(app.config)3 方式三:通过py文件设置 settings.pyapp.config.from_pyfile('./settings.py')# 会加载settings中得大写的配置,都放在config中# settings文件中 , 使用 例如 DEBUG=True形式print(app.config)4 方式四:了解,使用环境变量----需要dotenv使用# 需要有.env文件,配置和上面settings一样形式app.config.from_envvar("环境变量名称")5 方式五,常用,通过类# 通过在settings中写类,在类中配置即可,可配置多个类,也就可以实现多套配置app.config.from_object('settings.ProductionConfig')app.config.from_object('settings.DevelopmentConfig')print(app.config)6 其他app.config.from_json("json文件名称")# JSON文件名称,必须是json格式,因为内部会执行json.loadsapp.config.from_mapping({'DEBUG': True})'settings.py'# DEBUG = True# HOST = '192.168.255.1'class Config(object):DEBUG = FalseTESTING = FalseSECRET_KEY='123'DATABASE_URI = '127.0.0.1'class ProductionConfig(Config): # 例如上线配置DEBUG = FalseSECRET_KEY = 'asfasfd.ea33435asfasf'DATABASE_URI = '192.168.1.23'class DevelopmentConfig(Config): # 例如开发配置DEBUG = TrueDATABASE_URI = '127.0.0.1'
默认配置文件
{'DEBUG': get_debug_flag(default=False), 是否开启Debug模式'TESTING': False, 是否开启测试模式'PROPAGATE_EXCEPTIONS': None, 'PRESERVE_CONTEXT_ON_EXCEPTION': None,'SECRET_KEY': None, #秘钥'PERMANENT_SESSION_LIFETIME': timedelta(days=31), #sessio过期时间'USE_X_SENDFILE': False,'LOGGER_NAME': None,'LOGGER_HANDLER_POLICY': 'always','SERVER_NAME': None,'APPLICATION_ROOT': None,'SESSION_COOKIE_NAME': 'session', # 操作session--》成cookie到浏览器--》key值session'SESSION_COOKIE_DOMAIN': None,'SESSION_COOKIE_PATH': None,'SESSION_COOKIE_HTTPONLY': True,'SESSION_COOKIE_SECURE': False,'SESSION_REFRESH_EACH_REQUEST': True,'MAX_CONTENT_LENGTH': None,'SEND_FILE_MAX_AGE_DEFAULT': timedelta(hours=12),'TRAP_BAD_REQUEST_ERRORS': False,'TRAP_HTTP_EXCEPTIONS': False,'EXPLAIN_TEMPLATE_LOADING': False,'PREFERRED_URL_SCHEME': 'http','JSON_AS_ASCII': True,'JSON_SORT_KEYS': True,'JSONIFY_PRETTYPRINT_REGULAR': True,'JSONIFY_MIMETYPE': 'application/json','TEMPLATES_AUTO_RELOAD': None,}
补充
'后期项目中,可能使用配置中心'本地项目从配置中心获取配置信息--》写入到项目中以后只需要改配置中心,所有项目配置都会变化'配置中心:'-携程的阿波罗(Apollo)携程阿波罗(Apollo):构建环境非常复杂–底层架构的颗粒度拆分的非常细文档:https://www.apolloconfig.com/#/zh/READMEgit地址:https://github.com/apolloconfig/apollo-Spring Cloud ConfigSpringCloud Config:属于spring体系,没有界面,配置文件内容存放在git上面-Nacos(阿里)轻量级的配置中心Nacos即可以作为注册中心,也可以作为分布式配置中心,轻量级的git地址:https://github.com/alibaba/nacos/文档地址:https://nacos.io/zh-cn/docs/what-is-nacos.html
十二、路由系统
路由的典型写法
@app.route('/detail/<int:id>', methods=['GET', 'POST'], endpoint='detail') # int转换器def detail():return 'hello'"""methods: 列表规定了请求方式 如果列表中没有请求方式不被允许endpoint: 路由别名 如果不写会被装饰的函数名作为别名 """
路由中的默认转换器
DEFAULT_CONVERTERS = {'default': UnicodeConverter, # 默认'string': UnicodeConverter, # 字符串'any': AnyConverter, # 任何类型'path': PathConverter, # 路径'int': IntegerConverter, # 数字'float': FloatConverter, # 小数'uuid': UUIDConverter, # asdad-asdda-asdaa}from flask import Flask
app = Flask(__name__)
app.debug=True# @app.route('/<int:number>') # 数字类型
# @app.route('/<name>') # 默认
# @app.route('/<string:name>') # 字符串
@app.route('/<path:path>') # 路径,路由后面带斜杠 http://127.0.0.1:5000/name=jack
def index(path):return 'hello'+str(path)if __name__ == '__main__':app.run()
路由本质
1. decorator = app.route('/',methods=['GET','POST'],endpoint='n1') # 如果没有传endpoint,这个地方就是Nonedef route(self, rule, **options):# app对象 # rule= / # options = {methods=['GET','POST'], endpoint='n1'}def decorator(f):endpoint = options.pop('endpoint', None)self.add_url_rule(rule, endpoint, f, **options)# self是Flask的对象 app:rule路由 endpoint:别名,是None 其他的打散了传入了(methods..)return freturn decorator2. @decoratordecorator(index)# 加了装饰器最终,返回的还是index,只不过执行了 self.add_url_rule(rule, endpoint, f, **options)"""Flask类中的add_url_rule方法最终意思:rule就是装饰器传入的路径与路由endpoint别名view_func视图函数不加括号最终结论“现在不需要使用装饰器来注册路由”app.add_url_rule('/home', view_func=home, endpoint='home')...(最终的结果就像Django中的SimpleRouter自动生成路由 可以写多个)
"""
Add_url_rule的参数
@app.route和app.add_url_rule参数:rule == urlview_func == 视图函数名称defaluts == None 默认值 需要穿值就是 defaluts = {'K': 'v'}endpoint == None 名称 用于反向生成url methods = None 允许请求的方式strict_slashes = None 对url最后的/符号是否严格要求 # @app.route('/index', strict_slashes=False) 如果是True的话那就需要严格添加/否则匹配失败redirect_to = None 重定向到指定地址# @app.route('/index/<int:id>', redirect_to='/home/<id>') 当访问起那么这个路径直接跳转到后面这个路径
相关文章:
Flask入门一(介绍、Flask安装、Flask运行方式及使用、虚拟环境、调试模式、配置文件、路由系统)
文章目录 一、Flask介绍二、Flask创建和运行 1.安装2.快速使用3.Flask小知识4.flask的运行方式 三、Werkzeug介绍四、Jinja2介绍五、Click CLI 介绍六、Flask安装 介绍watchdog使用python–dotenv使用(操作环境变量) 七、虚拟环境 介绍Mac/linux创建虚拟…...
CAD C# 批量替换当前图中块
本案例功能为选择当前文档中一个块(旧块),然后选择新图元(新块),运行插件后新块将替换图中所有的旧块。 效果如下: public static class Class1{//选取对象替换块定义[CommandMethod("TT&…...
Android -- [SelfView] 自定义多行歌词滚动显示器
Android – [SelfView] 自定义多行歌词滚动显示器 流畅、丝滑的滚动歌词控件* 1. 背景透明;* 2. 外部可控制进度变化;* 3. 支持屏幕拖动调节进度(回调给外部);效果 歌词文件(.lrc) 一. 使用…...
vscode 配置C/C++环境控制台参数
您可以通过以下步骤在VS Code中配置C/C环境的控制台参数: 1,打开VS Code并进入您的C/C项目 2,点击左侧的"调试"图标,然后点击顶部的齿轮图标,选择“launch.json”。 3,在"launch.json&qu…...
【HarmonyOS学习日志(13)】计算机网络之TCP/IP协议族(二)
文章目录 TCP/IP协议族ARPDNS标志字段:协商具体的通信方式和反馈通信状态DNS查询问题的格式资源记录(Resource Record, RR)格式:被用于应答字段、授权字段和额外信息字段 IP协议IP服务的特点无状态无连接不可靠 IP头部结构IPv4头部…...
多系统对接的实现方案技术分析
前言 随着信息化和大数据时代的到来,数据资产变得至关重要,企业纷纷上线多种软件系统和移动端应用以适应这一变化。这些系统和应用虽然发挥了各自的优势,但也导致了信息孤岛问题。为了解决这一问题,数据中台和异构系统集成技术应…...
kv类型算子使用
对kv类型的RDD数据集进行操作。 keys """ 获取所有的key转换算子"""inputRdd sc.parallelize([(laoda, 11), (laoer, 22), (laosan, 33), (laosi, 44)]) print(inputRdd.keys().collect()) # [laoda, laoer, laosan, laosi] values "&…...
3维建模blender
官网稳定版下载:https://www.blender.org/download/lts/ windows有安装版和portable版 教程:https://www.bilibili.com/video/BV1kX4y1m7G5 1. 基础操作 场景操作 场景位移:shift鼠标中键长按场景旋转:鼠标中键长按场景缩放&…...
百问FB网络编程 - UDP编程简单示例
6.5 UDP编程简单示例 UDP服务器首先进行初始化操作:调用函数socket创建一个数据报类型的套接字,函数bind将这个套接字与服务器的公认地址绑定在一起。然后调用函数recvfrom接收UDP客户机的数据报。UDP客户机首先调用函数socket创建一个数据报套接字&…...
面试题:什么是ThreadLocal,如何实现的?
强烈推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:人工智能 你是否还在为简历无人阅读而感到沮丧?是否因为寻觅不到理想的工作机会而感到焦虑不安?试试:看看…...
js后端开发之Next.js、Nuxt.js 与 Express.js
后端js之Next.js、Nuxt.js 与 Express.js 在现代 Web 开发中,JavaScript 已经成为前后端通用的编程语言,而选择合适的后端框架则是构建高效、可扩展应用程序的关键。本文将带你深入了解三个流行的 JavaScript 后端框架:Next.js、Nuxt.js 和 …...
飞牛Nas如何实现阿里云盘、百度网盘的资料迁移!
文章目录 📖 介绍 📖🏡 演示环境 🏡📒 如何使用飞牛NAS实现阿里云盘与百度网盘的数据互相迁移 📒📝 操作步骤注意事项⚓️ 相关链接 ⚓️📖 介绍 📖 你是否有将百度网盘的文件迁移到阿里云盘,或是将阿里云盘的资料转移到百度网盘的需求?本文将给大家演示如…...
如何在小米平板5上运行 deepin 23 ?
deepin 23 加入了 ARM64 支持,这里尝试将 deepin 系统刷入平板中,平常使用中,带个笔记本电脑有时候也会嫌比较麻烦,把 Linux 系统刷入平板中既满足了使用需要,又满足了轻便的需求。为什么不使用 Termux ?虽…...
【PlantUML系列】流程图(四)
目录 目录 一、基础用法 1.1 开始和结束 1.2 操作步骤 1.3 条件判断 1.4 并行处理 1.5 循环 1.6 分区 1.7 泳道 一、基础用法 1.1 开始和结束 开始一般使用start关键字;结束一般使用stop/end关键字。基础用法包括: start ... stopstart ...…...
操作系统:进程、线程与作业
背景介绍: 因为单道程序处理器效率低 、设备利用率低 、内存利用率低的问题人们提出了多道程序设计来解决这个问题。 多道程序致力于提高处理机、设备、内存等各种资源的利用率,从而提高系统效率,也就是吞吐量,吞吐量定义为单位时…...
先验地图--slam学习笔记
先验信息 (Prior Information) 先验信息指的是在收集新数据之前已有的知识或假设。这种信息可以来自之前的实验、历史数据、理论模型或专家意见。 地图信息:在无人驾驶中,车辆通常会预先加载高精度地图数据,这些地图数据提供了道路布局、车…...
空指针异常:软件开发中的隐形陷阱
在软件开发的世界里,bug如同隐藏在代码森林中的小怪兽,不时跳出来给开发者们制造惊喜(或惊吓)。其中,空指针异常(Null Pointer Exception, NPE)无疑是最令人头疼的一类。它悄无声息,…...
【Java从入门到放弃 之 GC】
垃圾回收 垃圾回收什么是垃圾引用计数法可达性分析算法 垃圾回收算法标记清除法标记复制法标记整理法分代 常用的垃圾回收器 垃圾回收 如果你学过C,你肯定知道,我们没申请一块内存,都要自己写回收内存的方法。而Java不需要我们管理内存&…...
【C++】等差数列末项计算题解析及优化
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述与输入输出要求💯数学分析与公式推导公差的计算通项公式推导 💯示例解析解题步骤 💯程序实现与解析初版代码代码解析优点与不足…...
vue中父组件接收子组件的多个参数的方法:$emit或事件总线
方法一:使用 $emit 方法 原理 子组件通过 $emit 方法向父组件发送事件,同时可以传递多个参数,父组件通过事件监听来接收这些参数。 示例 子组件代码 <template><div><button click"sendData">发送数据</…...
2024.12.10——攻防世界Web_php_include
知识点:代码审计 文件包含 伪协议 伪协议知识点补充: 在PHP中,伪协议(Pseudo Protocols)也被称为流包装器,这些伪协议以 php://开头,后面跟着一些参数,用于指定要执行的操作或需要…...
【机器学习算法】——数据可视化
1. 饼图:显示基本比例关系 import matplotlib.pyplot as pltplt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False# ——————————————————————————————————————————————————————…...
如何在 Android 项目中实现跨库传值
背景介绍 在一个复杂的 Android 项目中,我们通常会有多个库(lib),而主应用程序(app)依赖所有这些库。目前遇到的问题是,在这些库中,libAd 需要获取 libVip 的 VIP 等级状态…...
JavaCV之FFmpegFrameFilter视频转灰度
1、代码 package com.example.demo.ffpemg;import lombok.SneakyThrows; import org.bytedeco.javacv.*;public class FFmpegFrameFilterVideoExample {SneakyThrowspublic static void main(String[] args) {// 输入视频文件路径String inputVideoPath "f:/2222.mp4&qu…...
Redis:基于PubSub(发布/订阅)、Stream流实现消息队列
Redis - PubSub、Stream流 文章目录 Redis - PubSub、Stream流1.基于List的消息队列2.基于PubSub的消息队列3.基于Stream的消息队列1.Redis Streams简介2.Redis Streams基本命令1.XADD 添加消息到末尾2.XLEN 获取消息长度3.XREAD 读取消息 (单消费模式)4…...
C#飞行棋(新手简洁版)
我们要在主函数的顶部写一些全局静态字段 确保能在后续的静态方法中能够获取到这些值和修改 static int[] Maps new int[100];static string[] PlayerName new string[2];static int[] PlayerScore new int[2];static bool[] Flags new bool[2] {true,true }; static int[]…...
【OpenCV】图像转换
理论 傅立叶变换用于分析各种滤波器的频率特性。对于图像,使用 2D离散傅里叶变换(DFT) 查找频域。快速算法称为 快速傅立叶变换(FFT) 用于计算DFT。 Numpy中的傅立叶变换 首先,我们将看到如何使用Numpy查…...
力扣 重排链表-143
重排链表-143 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), next(next)…...
【Kubernetes理论篇】容器集群管理系统Kubernetes(K8S)
Kubernetes集群部署基本管理实战 这么好的机会,还在等什么! 01、Kubernetes 概述 K8S是什么 K8S 的全称为 Kubernetes (K12345678S),PS:“嘛,写全称也太累了吧,写”。不如整个缩写 K8s 作为缩写的结果…...
Kubernetes 常用操作大全:全面掌握 K8s 基础与进阶命令
Kubernetes(简称 K8s)作为一种开源的容器编排工具,已经成为现代分布式系统中的标准。它的强大之处在于能够自动化应用程序的部署、扩展和管理。在使用 Kubernetes 的过程中,熟悉常用操作对于高效地管理集群资源至关重要。本文将详…...
iis网站伪静态/谷歌google
这是免费系列教程《7天学会商业智能(BI)-Tableau》的第5天,前面我们介绍了如何用Tableau对数据建模?,今天介绍如何用Tableau可视化数据。你将学会:如何可视化数据?如何创建筛选器?如何绘制地图?…...
西宁网站制作费用是多少钱/黄山seo公司
记录学习,不进行正文展示 目录 1、pom.xml 2、拦截器 3、RestController 5、SpringBoot启动类 6、application.properties 7、测试 1、pom.xml <!--springBoot工程--><groupId>com.qinluyu</groupId><artifactId>SpringBoot01</a…...
西宁seo快速排名/seo服务套餐
如果有一个语法正确的shader源文件,其包括若干关于uniform变量的定义。请写一个程序从某个shader源文件里提取其全部定义的uniform变量。要求记录其名称、数据类型和初始值(如果有定义)。而且能够设计一个函数能够改动某个uniform变量的值。 …...
建设工程资讯哪个网站好/百度首页网址
IDC报告显示,交换机市场近年来一直保持着较高的增长势头,到2009年市场规模有望达到15.1亿美元。交换机在企业网中占有重要的地位,通常是整个网络的核心所在,这一地位使它成为******和病毒肆虐的重点对象,为保障自身网络…...
怎样快速提升网站权重/各平台推广费用
数据库是一个共享资源, 它允许多个用户程序并行地存取数据库中的数据, 但是, 如果系统对并行操作不加以控制, 就会存取不正确的数据, 破坏数据库的完整性。在多个事务并发执行的系统中, 主要采取封锁协议来…...
网站百度不收录/免费的推广软件下载
读写锁和文件读写对速度的影响 因项目需求,添加一个功能,要不每次都打开一个文件,并遍历它,要不是一次读取至全局变量,每次遍历全局变量加读写锁,这两钟方案的速度需要简单测试一下 代码如下 #include &l…...