网站制作案例效果,wordpress图片本地化慢,建设局招聘条件,php网站开发答辩问的问题文章目录 一、Flask介绍二、Flask创建和运行1.安装2.快速使用3.Flask小知识4.flask的运行方式 三、Werkzeug介绍四、Jinja2介绍五、Click CLI 介绍六、Flask安装介绍watchdog使用python--dotenv使用#xff08;操作环境变量#xff09; 七、虚拟环境介绍Mac/linux创建虚拟环境… 文章目录 一、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咱们会用sqlalchemypeewee....3.fastapipython的异步web框架跟flask相似也只保留了web开发的核心功能其他需要借助第三方实现-异步框架-更方便的使用ppython async和await关键字来实现异步操作4.sanicpython的异步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 worldif __name__ __main__:# 运行app默认运行在5000# 默认是host127.0.0.1, port5000端口app.run()运行后http://127.0.0.1:5000访问这个地址即可看到helloworld了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_keyshashoashofisj放值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-dotenvflask app run三、Werkzeug介绍 Werkzeug是一个WSGI工具包他可以作为一个Web框架的底层库。这里稍微说一下 werkzeug 不是一个web服务器也不是一个web框架而是一个工具包官方的介绍说是一个 WSGI 工具包它可以作为一个 Web 框架的底层库因为它封装好了很多 Web 框架的东西例如 RequestResponse 等等 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服务器调用这个对象的时候会传入 两个参数environstart_response-flask中能找到这两个参数django中也能找到这两个参数后期测试django项目使用wsgiref上线djagno项目使用uwsgigunicorn测试flask项目使用werkzeug上线flask项目使用uwsgigunicorn1 写了一个可调用对象可以使用符合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 bh1Hello, web!/h1return [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 fHello {request.args.get(name, World)}!response Response(text, mimetypetext/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 clickclick.command()click.option(--count, default1, helpNumber of greetings.)click.option(--name, promptYour name,helpThe person to greet.)def hello(count, name):for x in range(count):click.echo(fHello {name}!)if __name__ __main__:hello()1 python app.py --count3 # app.py是当前运行页py的名称# count3循环三次2 python app.py --help3 python app.py --count3 --namejack六、Flask安装
介绍 最新版本最低支持 python3.81 安装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(levellogging.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, recursiveTrue)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下的配置文件设置进环境变量# 配置按照keyvalue的形式 USERNAMEJACKresload_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/activateWin创建虚拟环境 创建虚拟环境mkdir myprojectcd myprojectpy -3 -m venv .venv# 激活虚拟环境.venv\Scripts\activate八、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, qNone):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: 迪丽热巴Dilraba1992年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 没有POSTGET# 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,usersUSERS)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,infoinfo)else:return redirect(/login)if __name__ __main__:app.run(debugTrue)
login.html
!DOCTYPE html
html langen
headmeta charsetUTF-8title登录/title
/head
body
form methodpostp用户名 input typetext nameusername/pp密码 input typepassword namepassword/ppinput typesubmit value登录span{{ errors }}/span/p
/form
/body
/html
index.html
!DOCTYPE html
html langen
headmeta charsetUTF-8titleTitle/title
/head
body{% for k,v in users.items() %}divid:{{ k }}/divdiva href/detail/{{ k }}{{ v.name }}/a/divdiv{{ v[age] }}/divdiv{{ v.get(gender) }}/divdivimg src{{v.img}} alt width100px height100px/divhr
{% endfor %}
/body
/htmldetail.html
!DOCTYPE html
html langen
headmeta charsetUTF-8titleTitle/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(/,endpointindex)authdef index():return render_template(index.html,usersUSERS)十一、Flask配置文件
配置方式 from flask import Flask,jsonifyapp Flask(__name__)1 方式一:放在app对象上本质会放在 app.config 里面app.debug Falseapp.secret_key xxkjl.xxxlxkj.xxljafsdkljfsprint(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文件中 使用 例如 DEBUGTrue形式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.1class Config(object):DEBUG FalseTESTING FalseSECRET_KEY123DATABASE_URI 127.0.0.1class ProductionConfig(Config): # 例如上线配置DEBUG FalseSECRET_KEY asfasfd.ea33435asfasfDATABASE_URI 192.168.1.23class DevelopmentConfig(Config): # 例如开发配置DEBUG TrueDATABASE_URI 127.0.0.1默认配置文件 {DEBUG: get_debug_flag(defaultFalse), 是否开启Debug模式TESTING: False, 是否开启测试模式PROPAGATE_EXCEPTIONS: None, PRESERVE_CONTEXT_ON_EXCEPTION: None,SECRET_KEY: None, #秘钥PERMANENT_SESSION_LIFETIME: timedelta(days31), #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值sessionSESSION_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(hours12),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], endpointdetail) # int转换器def detail():return hellomethods: 列表规定了请求方式 如果列表中没有请求方式不被允许endpoint: 路由别名 如果不写会被装饰的函数名作为别名 路由中的默认转换器 DEFAULT_CONVERTERS {default: UnicodeConverter, # 默认string: UnicodeConverter, # 字符串any: AnyConverter, # 任何类型path: PathConverter, # 路径int: IntegerConverter, # 数字float: FloatConverter, # 小数uuid: UUIDConverter, # asdad-asdda-asdaa}路由本质
1. decorator app.route(/,methods[GET,POST],endpointn1) # 如果没有传endpoint这个地方就是Nonedef route(self, rule, **options):# app对象 # rule / # options {methods[GET,POST], endpointn1}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_funchome, endpointhome)...(最终的结果就像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_slashesFalse 如果是True的话那就需要严格添加/否则匹配失败redirect_to None 重定向到指定地址# app.route(/index/int:id, redirect_to/home/id) 当访问起那么这个路径直接跳转到后面这个路径