找回密码
 会员注册
查看: 15|回复: 0

Python小而精Web开发框架Flask精通指南

[复制链接]

2

主题

0

回帖

7

积分

新手上路

积分
7
发表于 2024-9-7 17:15:55 | 显示全部楼层 |阅读模式
文章目录Flask简介说明Flask核心依赖Flask常用扩展Flask快速启动工作流程代码示例Flask快速启动控制台Flask快速启动效果Flask启动参数Flask路由定义Flask支持的HTTP请求方式:路由装饰器中的参数Flask路由参数Flask路由蓝图路由蓝图的优点路由蓝图的参数Flask请求对象Flask响应对象Flask会话保持Cookie简介Cookie使用示例代码Session简介Session使用示例代码Flask异常处理abort函数(主动抛出)errorhandler装饰器Flask钩子函数常用钩子函数示例代码示例代码说明钩子函数工作流程Flask模板语言Flask模版渲染概念示例代码FlaskWeb表单Web表单创建流程WTForms支持字段WTForms常用验证函数Web表单示例代码Flask跨域资源共享1.安装Flask-CORS2.导入并使用Flask-CORS3.自定义CORS配置Flask数据库操作Flask简介说明Flask是一个用Python编写的轻量级Web应用框架。它的核心非常简单,但是可以通过各种插件来扩展,使其可以用来构建复杂的Web应用。Flask的设计目标是保持核心简单且易于使用,同时能够被扩展以适应不同的应用需求。Flask框架主要特点:轻量级:Flask本身只提供了最基础的Web功能,如URL路由、请求和响应处理等。这使得Flask非常轻量,易于学习和使用。易于扩展:虽然Flask本身功能有限,但是它可以通过各种插件来扩展,如数据库操作(Flask-SQLAlchemy)、表单处理(Flask-WTF)、用户认证(Flask-Login)等。模板引擎:Flask使用Jinja2作为其模板引擎,可以方便地生成动态HTML内容。Flask核心依赖Flask框架的核心依赖是Werkzeug和Jinja2。Werkzeug是一个遵循WSGI协议的Python函数库,提供了许多用于构建Web应用程序的工具,包括路由、调试、表单处理、会话管理、文件上传、JSON处理、安全性等。Jinja2是一个Python的模板引擎,常与Flask一起使用来渲染HTML页面,它允许在HTML文件中使用变量和逻辑控制结构来动态生成内容。Flask本身相当于一个内核,其他的功能都通过扩展来实现,如邮件扩展Flask-Mail、用户认证Flask-Login、数据库Flask-SQLAlchemy等。Flask常用扩展这种设计理念使得Flask保持了其核心的简单性,同时鼓励开发者根据项目的具体需求,通过集成各种第三方扩展来丰富和扩展其功能。这种灵活性使得Flask能够应对各种复杂的Web开发场景,同时保持代码的清晰和可维护性。Flask的插件库是其强大功能的重要来源,允许你根据自己的需求,选择适合的插件来扩展Flask的功能,从而实现网站的个性化定制。例如,对于数据库操作,Flask-SQLAlchemy插件提供了对SQLAlchemy的集成,使得数据库操作变得更加简单和直观;对于邮件处理,Flask-Mail插件则提供了对SMTP服务器的支持,使得发送邮件变得轻而易举。用途插件名称安装方法数据库操作Flask-SQLAlchemypipinstallflask-sqlalchemy数据库迁移Flask-Migratepipinstallflask-migrate表单处理Flask-WTFpipinstallflask-wtf邮件处理Flask-Mailpipinstallflask-mail后台管理Flask-Adminpipinstallflask-admin用户认证Flask-Loginpipinstallflask-loginToken认证Flask-JWT-Extendedpipinstallflask-jwt-extended接口频率限制Flask-Limiterpipinstallflask-limiterSession管理Flask-Sessionpipinstallflask-session密码生成Flask-Bcyptpipinstallflask-bcypt缓存FLask-Cachingpipintallflask-caching页面调试Flask-DebugToobarpipinstallflask-debugtoolbar静态文静缓存Flask-Static-Digestpipinstallflask-static-digest本地化日期时间Flask-Momentpipinstallflask-moment集成BootStrap框架Flask-Bootstrppipinstallflask-bootstrap开发REST风格根据Flask-RESTfulpipinstallflask-restfulFlask快速启动工作流程Flask请求-响应工作流程代码示例#导入类flask.FlaskfromflaskimportFlask#实例化创建一个Flask应用,app为应用的名称,__name__是一个标识Python模块的名字的变量#若当前模块是主模块,那么此模块的名字就是__main__#若当前模块是被import的,则此模块名字为文件名app=Flask(__name__)#app.route('/')返回一个装饰器,为函数index()绑定对应的URL,当用户访问这个URL时就会触发这个函数@app.route("/")defhello():#响应:返回给浏览器的数据return"HelloFlask"#再添加一个路由和视图函数@app.route("/index")defindex():return"IndexTest首页测试..."if__name__=='__main__':#run()启动的时候可以添加参数#debug是开启调试牧师,开启后修改过python代码会自动重启服务#port启动指定服务器的端口号,默认5000#host启动指定主机IP地址,默认是128.0.0.1,指定为0.0.0.0代表本机所有IPapp.run(debug=True)12345678910111213141516171819202122232425262728Flask快速启动控制台Flask快速启动效果访问网址"http://127.0.0.1:5000/"Flask启动参数在Flask中,**app.run()**方法用于启动服务器;它有几个参数,可以用来配置服务器的行为。下面是app.run()方法的参数及其含义:**host:**指定服务器监听的主机地址,默认值:'127.0.0.1'也就是只在本机上可访问**port:**指定服务器监听的端口号,默认值:5000。**debug:**如果设置为True,服务器将运行在调试模式下。在调试模式下,服务器会在发生错误时显示详细的错误页面,而不是简单的错误消息。这对于开发和调试非常有用,但在生产环境中应该禁用调试模式。**load_dotenv:**如果设置为True,Flask将在启动时加载.env文件中的环境变量。这通常用于存储敏感信息,如数据库密码或API密钥。**threaded:**如果设置为True,服务器将使用多线程来处理请求。这可以提高并发性能,但可能会增加资源消耗。**processes:**指定服务器应该使用多少个进程来处理请求。通常,这个参数只在多线程模式下有效。增加进程数可以提高并发性能,但也会增加资源消耗。**passthrough_errors:**如果设置为True,服务器将不会捕获异常,而是将它们直接传递给WSGI应用程序。这通常用于在应用程序中自定义错误处理。Flask路由定义在Flask中,@app.route()装饰器发挥着至关重要的作用;它负责定义和映射应用程序的URL规则;在Flask中,支持多种HTTP请求方法,如GET、POST、PUT、DELETE等;并且允许为每种请求方法定义不同的处理函数,以及使用methods参数为同一个URL路径定义多个请求方法。Flask支持的HTTP请求方式:GET:用于请求数据。POST:用于提交数据,通常用于表单提交。PUT:用于更新资源。DELETE:用于删除资源。HEAD:与GET类似,但服务器只返回HTTP头部信息,不返回实际内容。OPTIONS:用于获取目标资源所支持的通信选项。PATCH:用于对资源进行部分更新。fromflaskimportFlaskapp=Flask(__name__)#可以使用methods参数在路由装饰器中指定多个请求方法@app.route('/example',methods=['GET','POST'])defexample():ifrequest.method=='GET':#处理GET请求return'ThisisaGETrequest'elifrequest.method=='POST':#处理POST请求return'ThisisaPOSTrequest'if__name__=='__main__':app.run(debug=True)12345678910111213141516路由装饰器中的参数Flask的路由装饰器@app.route()和@blueprint.route()路由蓝图有几个常用的参数:rule:指定路由规则的字符串,通常是路径模板,例如'/hello'。methods:一个包含所支持HTTP请求方法的列表,如['GET','POST']。endpoint:指定路由的端点名称,用于在程序中唯一标识这个路由。如果不指定,Flask会自动为路由生成一个端点名称。strict_slashes:如果设置为True,则要求URL必须与规则完全匹配。例如,如果规则是'/foo',那么/foo/将不会匹配这个规则。默认为False。redirect_to:如果提供了这个参数,当路由被访问时,将会重定向到指定的URL。这通常用于旧URL的重定向。subdomain:指定子域名,例如'.example.com'。这样,当访问user.example.com时,可以匹配到这个路由。fromflaskimportFlaskapp=Flask(__name__)@app.route('/users/',methods=['GET'],strict_slashes=True,endpoint='user_profile')defshow_user_profile(username):#显示用户资料returnf'UserProfilefor{username}'@app.route('/old-url',redirect_to='/new-url')defredirect_old_url():#重定向旧URL到新URLpass@app.route('/new-url')defredirect_new_url():#返回新视图函数的处理结果returnf"newurlreturn"if__name__=='__main__':app.run(debug=True)12345678910111213141516171819202122232425Flask路由参数类型说明string(默认)仅可接受任何不包含斜杠的文本int仅可接受任何不包含斜杠的整数float仅可接受任何不包含斜杠的浮点数path类似string,但可以接受文件路径(包含斜杠)uuid仅可接受任何不包含斜杠的uuid字符串any可以同时指定多种路径进行限定re通过继承BaseConverter实现自定义转换器实现正则匹配fromflaskimportFlaskapp=Flask(__name__)@app.route("/")defindex():return"Flask路由参数"@app.route("/string//")#声明了一个string类型的路由参数,这也是Flask中路由参数的默认类型#需要注意,视图函数中的参数需要和路由参数一致defget_string(username):print(type(username),username)returnf"姓名:{username}"@app.route("/int//")#声明了一个int类型的路由参数,仅接受整数类型,传递其他类型时会抛出异常,哪怕传递是float类型defget_int(age):print(type(age),age)returnf"年龄:{age}"@app.route("/float//")defget_float(money):print(type(money),money)returnf"存款:{money}"@app.route("/path/ /")defget_path(address):print(type(address),address)returnf"地址:{address}"@app.route("/any/ {%else%}{%endif%}12345678910111213141516171819login.html 登录 账号: 密码: 登录1234567891011121314151617Session简介Session概念当用户首次访问应用时,服务器会为用户创建一个Session,并为其分配一个唯一的SessionID。这个SessionID通常会被存储在一个Cookie中,这样浏览器在后续的请求中就可以自动携带这个ID,以便服务器能够识别并恢复用户的会话状态。由于Session数据存储在服务器端,因此相对于存储在客户端的Cookie来说;Session数据更加安全,不容易被用户篡改;同时,Session也支持存储更复杂的数据结构,比如对象、列表等。Session使用在Flask中,使用Session非常简单;Flask内置了一个session对象,你可以像操作字典一样来操作它。当你往session对象中添加数据时,Flask会自动将这些数据序列化并存储到服务器端的Session中。当用户下次发送请求时,Flask会自动从服务器端的Session中加载数据到session对象中。Session使用示例代码home.py和login.py文件中的代码不变,main.py文件代码修改如下importdatetimefromflaskimportFlask,render_template,request,redirect,sessionapp=Flask(__name__)#首页@app.route("/home")defhome():#4.获取Sessionusername=session.get("user")returnrender_template("home.html",username=username)#登录@app.route("/login",methods=["GET","POST"])deflogin():ifrequest.method=="GET":returnrender_template("login.html")elifrequest.method=="POST":pass#1.获取前段提交过来的数据username=request.form.get("username")password=request.form.get("password")#2.模拟登录:账号密码验证ifusername=="admin"andpassword=="123456":#登录成功response=redirect("/home")#3.设置Sessionsession["user"]=usernamesession.permanent=Truereturnresponseelse:return"账号或密码错误,请重试!"#注销@app.route("/logout")deflogout():response=redirect("/home")#5.删除Sessionsession.pop("user")returnresponseif__name__=='__main__':app.run(debug=True)1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556Flask异常处理abort函数(主动抛出)我们定义了一个路由/item/,它尝试从数据库中获取一个项目;如果项目不存在(即items.get(item_id)返回None);我们使用abort函数抛出一个404状态码,并附带一个描述性的消息。fromflaskimportFlask,abortapp=Flask(__name__)@app.route('/item/')defget_item(item_id):#模拟根据ID获取数据库中对应的项目数据items={1:"手机",2:"电脑",3:"平板",}item=items.get(item_id)ifitemisNone:#如果项目不存在,我们抛出404NotFound异常abort(404,description='主动抛出异常错误:Itemnotfound')#如果项目存在,我们返回它returnf'Item{item_id}found:{item}'if__name__=='__main__':app.run(debug=True)12345678910111213141516171819202122errorhandler装饰器这个装饰器不仅可以处理HTTP状态码,还可以处理Python异常;当Flask应用程序中发生异常时,它将查找是否有与该异常匹配的errorhandler;在处理HTTP状态码时,errorhandler装饰器通常用于处理那些你没有显式捕获的异常,或者你想要统一处理的情况。fromflaskimportFlask,abortapp=Flask(__name__)#定义全局的错误处理函数@app.errorhandler(404)defnot_found_error(error):#这里可以记录错误信息,比如写入日志文件#...#然后我们返回一个友好的错误消息给用户return'骚瑞~你要找的项目不存在...',404@app.route('/item/')defget_item(item_id):#模拟根据ID获取数据库中对应的项目数据items={1:"手机",2:"电脑",3:"平板",}item=items.get(item_id)ifitemisNone:abort(404,description='Itemnotfound')returnf'Item{item_id}found:{item}'if__name__=='__main__':app.run(debug=True)12345678910111213141516171819202122232425262728捕获Python代码引发的异常fromflaskimportFlaskapp=Flask(__name__)#定义处理除以零异常的函数@app.errorhandler(ZeroDivisionError)defdivision_by_zero(error):return'Youcannotdividebyzero!',400@app.route('/divide//')defdivide_numbers(a,b):try:result=a/bexceptZeroDivisionErrorase:#如果发生除以零的错误,我们抛出异常,稍后被errorhandler捕获raiseereturnf'Theresultof{a}dividedby{b}is{result}'if__name__=='__main__':app.run(debug=True)12345678910111213141516171819202122Flask钩子函数Flask的钩子函数(也称为信号或事件)是Flask框架提供的一种机制,允许开发者在请求处理的不同阶段插入自定义逻辑。这些钩子函数不需要手动调用,而是由Flask框架在特定事件发生时自动执行。常用钩子函数before_first_request:在处理第一个请求之前执行一次。这个钩子特别适用于那些只需要在应用启动时执行一次的初始化任务。before_request:在每次请求处理之前执行。这个钩子通常用于验证用户身份、解析请求数据等任务。如果这个函数返回了一个响应,那么请求处理将在此处停止,不再继续执行后续的视图函数。after_request:在每次请求处理之后(但在响应发送给客户端之前)执行。这个钩子允许你对即将发送给客户端的响应进行修改。teardown_request:无论请求处理过程中是否发生异常,都在每次请求结束后执行。这个钩子通常用于清理资源、记录日志等任务。示例代码fromflaskimportFlask,abort,jsonifyapp=Flask(__name__)@app.before_first_requestdefinitialize_app():print("Applicationisinitializing...")#在这里执行一些初始化任务,例如建立数据库连接等@app.before_requestdefbefore_each_request():print("Beforeprocessingeachrequest...")#在这里执行一些每次请求前都需要进行的任务,例如验证用户身份@app.route('/')defindex():print("Processingtheindexroute...")return"Hello,World!"@app.after_requestdefafter_request_handler(response):print("Afterprocessingeachrequest...")#在这里对响应进行修改,例如添加头部信息等returnresponse@app.teardown_requestdefteardown_request_handler(exception):print("Tearingdowntherequest...")#在这里进行资源清理、日志记录等任务ifexception:print("Anexceptionoccurred:",exception)if__name__=='__main__':app.run(debug=True)12345678910111213141516171819202122232425262728293031323334示例代码说明在这个示例中,我们定义了四个钩子函数:initialize_app、before_each_request、after_request_handler和teardown_request_handler。当应用启动时,initialize_app会在处理第一个请求之前执行。然后,对于每个请求,before_each_request会在视图函数之前执行,after_request_handler会在视图函数之后但在响应发送之前执行,而teardown_request_handler无论请求是否成功都会在请求结束后执行。请注意,钩子函数的执行顺序是固定的,按照它们在代码中定义的顺序执行。同时,这些钩子函数可以接收参数,以便在函数体内执行特定的任务。例如,after_request_handler接收一个response参数,允许你修改响应对象;而teardown_request_handler接收一个exception参数,如果有异常发生,你可以在这个函数内处理它。钩子函数工作流程Flask模板语言Jinja2是一个用于Python的强大的模板引擎,它被广泛用于各种Web开发框架中,包括Flask。Jinja2提供了一种简单的方式来动态地生成HTML或其他标记语言。Jinja2主要特性:变量替换:可以在模板中使用双大括号{{}}来插入变量,例如{{name}}。当模板被渲染时,这些变量将被实际的值替换。控制结构:Jinja2支持多种控制结构,包括条件语句({%if%}、{%else%}、{%elif%})和循环语句({%for%})。这使得你可以在模板中进行复杂的逻辑处理。模板继承:Jinja2支持模板继承,这意味着你可以定义一个基础模板(包含一些通用的元素,如页头、页脚等),然后创建多个继承自这个基础模板的子模板。这可以避免重复代码,使得模板更易于管理。过滤器:Jinja2提供了一系列的过滤器,可以用来修改变量的值。例如,{{name|lower}}将把name变量的值转换为小写。你也可以定义自己的过滤器。自动转义:为了防止跨站脚本攻击(XSS),Jinja2默认会自动转义所有的变量。这意味着如果变量的值包含HTML代码,这些代码将被转义为对应的HTML实体,而不会被浏览器解析执行。宏:Jinja2的宏类似于Python中的函数,可以用来封装可重用的模板片段。超链接跳转:关于Jinja2模板引擎学习文档,请看我另一篇推文Flask模版渲染概念在Flask中,视图函数负责处理请求并返回数据,而模板则负责将数据呈现给用户。视图函数将数据传递给模板,模板根据这些数据动态生成HTML页面。这个过程就是模板渲染。Flask默认使用的模板引擎是Jinja2,它提供了丰富的语法和功能,使得开发者可以轻松地控制HTML页面的输出。例如,Jinja2支持变量替换、条件语句、循环语句等,使得开发者可以根据数据动态生成页面内容。在Flask中,可以使用render_template()函数来渲染模板。该函数接受一个模板文件名作为参数,并将视图函数中的数据作为关键字参数传递给模板。模板文件通常放在templates文件夹下,使用.html作为文件扩展名。当视图函数调用render_template()函数时,Flask会加载指定的模板文件,并将数据填充到模板中,生成最终的HTML页面。然后,Flask将这个页面作为响应返回给客户端。模板渲染是Flask框架中非常重要的一个概念,它使得开发者可以更加灵活地控制页面的输出,提高了Web应用程序的可维护性和可扩展性。示例代码main.py代码#导入FLaskfromflaskimportFlask,render_template,jsonify#创建Flask应用对象,参数指明存放模板的文件夹app=Flask(__name__,template_folder='templates')#路由route+视图函数@app.route("/")defhello_world():#响应:返回给浏览器的数据return"Flask模板渲染!"#模板渲染@app.route("/index/")defindex():#返回字符串:支持HTML标签#return"FlaskIndexTest..."#JSON#jsonify序列化#returnjsonify({"name":"张三","age":22})#模板渲染returnrender_template("index.html",name="法外狂徒张三")if__name__=='__main__':app.run(debug=True)123456789101112131415161718192021222324252627282930index.html代码 IndexTest... name:{{name}} 12345678910111213141516171819index.css代码h2{color:cadetblue;}123FlaskWeb表单Flask的Web表单是指使用Flask框架创建和处理Web页面中的表单元素。表单是Web应用程序中用于收集用户输入的重要组件,例如登录表单、注册表单、搜索表单等。Flask提供了便捷的方式来创建和处理这些表单。使用Flask-WTF需要配置参数SECRET_KEYCSRF_ENABLED是为了CSRF(跨域请求伪造)保护,SECRET_KEY用来生成加密令牌,当CSRF激活的时候,该设置或根据设置的密钥生成加密令牌。CSRFCSRF全拼为CrossSiteRequestForgery,译为跨站请求伪造。CSRF指攻击者盗用了你的身份,以你的名义发送恶意请求。造成的问题:个人隐私泄露以及财产安全。防止CSRF攻击在客户端向后端请求界面数据的时候,后端会往响应中的cookie中设置csrf_token的值在Form表单中添加一个隐藏的的字段,值也是csrf_token在用户点击提交的时候,会带上这两个值向后台发起请求后端接受到请求,以会以下几件事件:从cookie中取出csrf_token从表单数据中取出来隐藏的csrf_token的值进行对比如果比较之后两值一样,那么代表是正常的请求,如果没取到或者比较不一样,代表不是正常的请求,不执行下一步操作Web表单创建流程安装和配置Flask-WTF扩展:Flask-WTF是一个用于处理表单的Flask扩展,它提供了表单验证、CSRF保护等功能。首先,需要安装这个扩展,然后在Flask应用中配置它。通常,你需要设置一个密钥(SECRET_KEY)用于表单的CSRF保护。定义表单类:使用Flask-WTF时,每个Web表单都由一个继承自FlaskForm的类表示。这个类定义了表单中的一组字段,每个字段都用一个对象表示。字段对象可以附加一个或多个验证函数,用于验证用户提交的输入值是否符合要求。渲染表单:在Flask的模板中,可以使用Jinja2模板引擎来渲染表单。通过调用表单字段,它们会被渲染成HTML表单元素。例如,一个文本框字段会被渲染成一个****元素。处理表单提交:在Flask的视图函数中,你可以处理表单的提交。当用户提交表单时,表单数据会被POST到服务器。你可以使用request.form来访问这些数据,并进行相应的处理,如验证、存储等。WTForms支持字段字段对象说明StringField文本字段TextAreaField多行文本字段PasswordField密码文本字段HiddenField隐藏文件字段DateField文本字段,值为datetime.date文本格式DateTimeField文本字段,值为datetime.datetime文本格式IntegerField文本字段,值为整数DecimalField文本字段,值为decimal.DecimalFloatField文本字段,值为浮点数BooleanField复选框,值为True和FalseRadioField一组单选框SelectField下拉列表SelectMutipleField下拉列表,可选择多个值FileField文件上传字段SubmitField表单提交按钮FormField把表单作为字段嵌入另一个表单FieldList一组指定类型的字段WTForms常用验证函数验证函数说明DataRequired确保字段中有数据EqualTo比较两个字段的值,常用于比较两次密码输入Length验证输入的字符串长度NumberRange验证输入的值在数字范围内URL验证URLAnyOf验证输入值在可选列表中NoneOf验证输入值不在可选列表中Web表单示例代码mian.py代码导入FLaskfromflaskimportFlask,render_templatefromflask_wtfimportFlaskFormfromwtformsimportStringField,PasswordField,SubmitFieldfromwtforms.validatorsimportDataRequired,Email,Length,EqualTo#创建Flask应用对象app=Flask(__name__,template_folder='templates')#关闭CSRF保护app.config['WTF_CSRF_ENABLED']=False#设置秘钥,关于安全的一般都需要设置秘钥app.config['SECRET_KEY']="kdkakikeiqkl;hjkiauhfipouhqkjklkll;kjkj1kl231"classRegistrationForm(FlaskForm):username=StringField('Username',validators=[DataRequired(),Length(min=2,max=20)])email=StringField('Email',validators=[DataRequired(),Email()])password=PasswordField('Password',validators=[DataRequired(),Length(min=8)])confirm_password=PasswordField('ConfirmPassword',validators=[DataRequired(),EqualTo('password')])submit=SubmitField('SignUp')@app.route('/register',methods=['GET','POST'])defregister():form=RegistrationForm()ifform.validate_on_submit():#如果表单验证通过,执行数据库操作等username=form.username.dataemail=form.email.datapassword=form.password.dataconfirm_password=form.confirm_password.data#模拟数据库操作,如判断用户名是否存在,密码加密等ifusernamenotin["admin","root"]:return{"message":f"{username},registersuccess"}else:return{"message":f"{username},registerfailed"}#form数据验证没有通过else:pass#如果访问不是通过submit提交上来的,即是第一次get访问,则返回模板returnrender_template('index.html',form=form)if__name__=='__main__':app.run(debug=True)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748index.html代码 Register {{form.hidden_tag()}} {{form.username.label}} {{form.username(size=20)}} {%forerrorinform.username.errors%}[{{error}}]{%endfor%} {{form.email.label}} {{form.email(size=20)}} {%forerrorinform.email.errors%}[{{error}}]{%endfor%} {{form.password.label}} {{form.password(size=20)}} {%forerrorinform.password.errors%}[{{error}}]{%endfor%} {{form.confirm_password.label}} {{form.confirm_password(size=20)}} {%forerrorinform.confirm_password.errors%}[{{error}}]{%endfor%} {{form.submit()}}123456789101112131415161718192021222324252627282930313233343536373839404142Flask跨域资源共享在Flask中实现跨域共享资源(CORS,Cross-OriginResourceSharing)可以通过多种方法,其中最常见的是使用Flask-CORS扩展。这个扩展可以轻松地添加跨域资源共享支持到你的Flask应用中。以下是使用Flask-CORS扩展实现跨域资源共享的步骤:1.安装Flask-CORS需要安装Flask-CORS扩展,pip命令如下:pipinstallFlask-CORS12.导入并使用Flask-CORS在Flask应用中,导入Flask-CORS并将其应用到你的应用实例上。fromflaskimportFlaskfromflask_corsimportCORSapp=Flask(__name__)CORS(app)#在应用实例上应用CORS#...其他路由和视图函数1234567这将为你的整个应用启用CORS。如果你只想为特定的路由启用CORS,可以在路由函数之前使用@cross_origin()装饰器。fromflaskimportFlask,jsonifyfromflask_corsimportcross_originapp=Flask(__name__)@app.route('/api/resource',methods=['GET'])@cross_origin()#仅对此路由启用CORSdefget_resource():returnjsonify({'message':'Hello,World!'})#...其他路由和视图函数12345678910113.自定义CORS配置Flask-CORS还允许你自定义CORS配置,例如指定允许的域名、请求方法等。CORS(app,resources={r"/api/*":{"origins":"*"}})1在上面的例子中,resources参数是一个字典,其中键是路径模式,值是一个包含CORS配置的字典,允许来自任何域的请求访问以/api/开头的路径。Flask数据库操作SQLAlchemy是一个用于Python的SQL工具包和对象关系映射(ORM)系统。它为高效和高性能的数据库访问提供了全面的企业级持久性模型;SQLAlchemy主要特点:对象关系映射(ORM):SQLAlchemy提供了一个全功能的ORM,它允许开发者以面向对象的方式处理数据库中的数据。你可以定义数据模型(即类),SQLAlchemy会自动将它们映射到数据库表。数据表达语言(DDL):SQLAlchemy提供了一种Pythonic的方式来生成和执行SQL语句,包括创建和删除表,插入、更新和删除数据等。SQL表达语言:SQLAlchemy提供了一种构造SQL查询的DSL(领域特定语言)。这种DSL提供了丰富的查询构造选项,并且可以跨多种数据库后端使用。数据库抽象层:SQLAlchemy提供了一种数据库抽象层,使得你可以使用相同的代码来操作不同的数据库系统(如MySQL、PostgreSQL、SQLite等)。事务和会话管理:SQLAlchemy提供了强大的事务和会话管理功能,使得你可以方便地处理数据库事务。连接池:SQLAlchemy内置了连接池功能,可以有效地管理数据库连接,提高应用性能。超链接跳转:关于SQLAlchemy学习文档,请看我另一篇推文安装插件pipinstallflask-sqlalchemy1初始化插件fromflaskimportFlaskfromflask_sqlalchemyimportSQLAlchemyapp=Flask(__name__)app.config['SQLALCHEMY_DATABASE_URI']='sqlite:db.sqlite'db=SQLAlchemy(app)123456定义模型classUser(db.Model):id=db.Column(db.Integer,primary_key=True)...123创建数据库表withapp.app_context():db.create_all()12
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-11 01:51 , Processed in 0.441729 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表