Python编程及项目开发课件 第8章 WEB开发_第1页
Python编程及项目开发课件 第8章 WEB开发_第2页
Python编程及项目开发课件 第8章 WEB开发_第3页
Python编程及项目开发课件 第8章 WEB开发_第4页
Python编程及项目开发课件 第8章 WEB开发_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章Python网站开发从框架到实战本章重点与难点本章重点KeyPointsMVC模式的概念及相关术语Flask框架及路由、蓝图、模板、表单Flask数据库操作Flask框架的Web应用开发本章难点Difficulties深入理解MVC模式的核心思想Flask框架中路由与蓝图的灵活运用综合运用Flask各项功能构建完整Web应用目录8.1常见的Web开发框架Flask、Django、FastAPI框架介绍与对比8.2MVC模式MVC模式概念、优缺点及在Flask中的实现8.3Flask开发环境的搭建虚拟环境创建、Flask安装与测试8.4Flask程序基本结构项目结构、路由、蓝图详解8.5Flask模板Jinja2模板引擎、变量、控制结构、模板继承8.6Flask表单Flask-WTF的使用,表单定义、渲染与处理8.7Flask数据库操作Flask-SQLAlchemy的使用,数据模型与CRUD操作8.8FlaskWeb应用开发实战综合案例:开发一个简单的博客系统8.1常见的Web开发框架Python拥有丰富的Web开发框架生态,选择合适的框架是项目成功的关键。8.1.1Flask框架Flask是一个使用Python编写的轻量级Web应用框架,被称为“微框架”。它仅保留核心功能(路由、模板引擎、WSGI),设计理念简洁灵活,非常适合快速开发。灵活性高无强制项目结构,开发者可自由选择和组合各种扩展,按需构建应用。学习曲线平缓代码简洁直观,核心API易于理解,非常适合Python初学者快速入门Web开发。扩展生态丰富拥有超过1000个官方扩展,可轻松实现认证、数据库连接、表单处理等功能。适用场景非常适合小型应用、微服务架构、API服务开发以及快速原型验证。8.1.2Django框架Django是一个开源的全栈式Web应用框架,采用“电池包含”的理念,提供了开发Web应用所需的几乎所有功能,旨在快速构建高质量的Web应用。强大的ORM支持原生支持多种主流关系型数据库,极大简化数据库操作,提升开发效率。完善的多语言支持内置国际化(i18n)和本地化(l10n)系统,便于构建面向全球用户的多语种网站。开箱即用的组件内置Ajax、RSS、缓存、用户认证等常见Web功能,避免重复造轮子。自动化管理后台内置功能强大且可定制的Admin界面,无需编写额外代码即可快速管理数据模型。适用场景非常适合构建内容管理系统(CMS)、大型复杂网站以及企业级应用。8.1.3FastAPI框架速度极快性能媲美Node.js和Go,基于异步处理能力,响应迅速。类型安全深度集成Python类型提示,开发期捕获错误,提升代码质量。自动文档自动生成SwaggerUI和ReDoc交互式文档,便于测试与调试。简洁高效语法简洁直观,学习曲线平缓,极大提升API开发效率。适用场景高性能API服务、实时聊天通知应用及数据密集型服务。三大框架对比特性FlaskDjangoFastAPI类型微框架全栈框架API框架核心优势轻量、灵活、扩展丰富功能全面、开箱即用、Admin后台高性能、类型安全、自动文档学习曲线平缓较陡中等适用场景小型应用、微服务、原型开发大型网站、CMS、企业应用高性能API、实时服务代表应用Netflix,UberInstagram,Pinterest各类高性能API服务8.2MVC模式理解MVC设计模式是构建清晰、可维护Web应用的基础。8.2.1MVC模式介绍模型(Model)负责处理数据和业务逻辑,独立于视图和控制器。它是应用程序的核心数据层。视图(View)负责展示数据,是用户交互的界面。它仅关注数据的呈现,不处理业务逻辑。控制器(Controller)负责接收用户输入,调用模型处理数据,并选择合适的视图进行展示,起到桥梁作用。总结:MVC模式通过分离关注点,使得代码结构更清晰,显著提升了系统的可维护性和扩展性。MVC模式:视图(View)数据展示将模型提供的数据以用户友好的方式展示出来,确保信息直观易懂。用户交互接收用户的输入(如点击按钮、提交表单),并将这些请求传递给控制器处理。格式呈现负责数据的格式化,例如将原始数据转换为HTML、JSON等格式进行输出。视图通常由HTML、CSS和JavaScript构成。它不处理业务逻辑,也不直接与数据库交互,仅专注于界面展示与交互。MVC模式:模型(Model)数据管理封装对数据库的操作,负责数据的增删改查(CRUD),是应用程序的数据基石。业务逻辑实现应用的核心业务规则和复杂算法,处理数据流转与业务决策,是应用的大脑。数据验证确保输入数据的完整性和有效性,维护数据的一致性,防止非法数据进入系统。模型独立于视图和控制器,不依赖具体的界面展示。这种低耦合性使得模型可以被多个视图复用,极大地提高了代码的重用性和可维护性。MVC模式:控制器(Controller)接收请求作为应用的入口,控制器负责接收用户通过视图界面发送的各类请求,是交互流程的起点。处理请求根据请求的类型和参数,控制器调用相应的模型组件来处理核心业务逻辑和数据操作。选择视图获取模型处理后的结果数据,选择最合适的视图模板进行渲染,将最终结果呈现给用户。控制器本身不输出内容也不处理业务逻辑,它像一个“中枢神经系统”,负责协调模型和视图的工作流程,确保系统高效运转。MVC模式的优点低耦合性视图、模型、控制器相互独立,修改其中一部分不会影响其他部分,有效降低系统复杂度。高重用性同一个模型可以为多个视图提供数据,同一个视图也可以展示不同模型的数据,提升代码复用率。易于维护和扩展清晰的分层结构使得代码逻辑一目了然,无论是理解现有代码还是添加新功能都更加容易。有利于团队协作前后端开发人员可以并行工作,分别专注于视图层和模型层的开发,显著提高开发效率。MVC模式的缺点增加系统复杂度对于简单的应用,严格遵循MVC会引入额外的结构层级,增加不必要的开发和维护成本。视图与控制器耦合虽然强调分离,但视图和控制器之间仍存在一定的依赖关系,并非完全独立,影响了部分灵活性。性能开销层与层之间的交互和数据传递可能会带来一定的性能损耗,在极端高性能场景下需要权衡。总结:尽管存在上述缺点,对于中大型Web应用而言,MVC模式带来的架构清晰性和可维护性优势依然显著。MVC模式在Flask中的实现模型(Model)使用SQLAlchemy等ORM库定义数据模型,负责处理核心的数据逻辑与持久化。视图(View)由HTML模板文件构成,负责数据的展示。通过render_template函数渲染并返回给用户。控制器(Controller)由Flask的视图函数承担,接收用户请求,调用模型处理数据,协调视图渲染。总结:Flask虽未强制严格的MVC结构,但遵循此思想可使项目结构更清晰,代码维护性更强。8.3Flask开发环境的搭建工欲善其事,必先利其器,搭建一个良好的开发环境是Flask开发的第一步。8.3.1创建虚拟环境为了避免不同项目之间的依赖冲突,推荐使用虚拟环境来隔离项目。Python3.3及以上版本自带了venv模块,可以方便地创建虚拟环境。Windows系统命令python-mvenvflask_projectmacOS/Linux系统命令python3-mvenvflask_project执行命令后,会在当前目录下创建一个名为flask_project的文件夹,其中包含了独立的Python解释器和库目录。8.3.2激活虚拟环境创建虚拟环境后,需要激活它才能在该环境中安装和运行包。激活成功后,命令行提示符前会显示环境名称。Windows(CMD)#命令提示符flask_project\Scripts\activateWindows(PowerShell)#PowerShell脚本.\flask_project\Scripts\Activate.ps1macOS/Linux#Bash/Zshsourceflask_project/bin/activate8.3.3安装Flask及扩展在激活的虚拟环境中,使用pip命令安装Flask核心包及其常用扩展:Terminal——安装命令#安装Flask核心包pipinstallflask

#安装常用扩展pipinstallflask-sqlalchemy#ORM数据库工具pipinstallflask-wtf#表单处理pipinstallflask-login#用户认证这些扩展将极大地简化我们后续的开发工作,涵盖了数据库、表单和用户管理等核心功能。8.3.4最小应用测试app.py(核心代码)fromflaskimportFlaskapp=Flask(__name__)@app.route('/')defhome():return"Flask成功运行!"if__name__=='__main__':app.run(debug=True)终端运行(Terminal)#启动开发服务器$pythonapp.py#预期输出ServingFlaskapp'app'Debugmode:onRunningon:5000/Flask运行界面展示启动与访问运行app.py后,在浏览器中输入地址::5000/验证成功状态如果看到左侧类似页面,说明开发环境搭建成功。这表明应用已成功启动并能正常响应HTTP请求。下一步计划确认环境就绪后,我们将深入学习Flask的核心功能与开发模式。8.4Flask程序基本结构了解Flask项目的组织方式,是构建可扩展应用的关键。8.4.1Flask项目结构-简单项目极简项目结构所有代码集中在单一文件中,适合快速原型开发,结构简单直接。my_flask_app/└──app.py典型适用场景简单的API服务快速构建轻量级接口,无需复杂分层。一次性脚本工具临时任务处理,用完即走的简单脚本。学习和实验项目专注于功能实现,便于理解核心逻辑。8.4.1Flask项目结构-中型项目随着项目规模增大,代码按功能模块拆分是必要的。以下是典型的中型项目结构:app.py-主应用入口包含应用的核心路由和业务逻辑,是程序启动的起点。static/-静态资源目录存放CSS样式表、JavaScript脚本和图片等静态文件。templates/-模板文件目录存放HTML模板文件,用于渲染动态生成的网页内容。8.4.1Flask项目结构-复杂项目对于大型应用,需按功能模块(如用户认证、管理后台)组织代码,通常使用蓝图(Blueprints)实现模块化管理。项目结构概览my_flask_app/├──app/#应用核心包│├──routes/#路由模块(蓝图)│├──models/#数据模型定义│├──static/&templates/├──migrations/#数据库迁移文件└──run.py#项目启动入口优势:结构清晰,便于多人协作开发与后期功能扩展。8.4.2Flask路由-基本概念核心机制解析路由(Routing)是Flask的核心概念,负责将URL地址与处理请求的Python函数(视图函数)关联。当用户访问URL时,Flask会匹配路由规则,执行对应函数并返回响应。通俗理解路由就像是应用的“导航系统”,它告诉Flask:“当用户访问这个特定的URL时,应该调用哪个函数来处理请求”。8.4.2Flask路由-基本路由定义核心概念:装饰器绑定在Flask中,使用@app.route装饰器来定义路由,将一个URL规则绑定到一个视图函数上。URL映射关系访问/(根路径)→调用index()函数访问/about→调用about()函数代码示例:定义基本路由fromflaskimportFlaskapp=Flask(__name__)

#根路径绑定到index函数@app.route('/')defindex():return"欢迎访问首页!"

#/about路径绑定到about函数@app.route('/about')defabout():return"关于我们页面"8.4.2Flask路由-动态路由核心概念动态路由允许在URL中包含变量部分,通过<variable_name>的语法来定义。Flask会自动将URL中的对应部分作为参数传递给视图函数。访问示例访问/user/alice→调用show_user('alice')访问/post/42→调用show_post(42)代码实现示例@app.route('/user/<username>')defshow_user(username):#username变量会自动从URL中获取returnf"用户名:{username}"

@app.route('/post/<int:post_id>')defshow_post(post_id):#指定类型为int,自动转换returnf"文章ID:{post_id}"8.4.2Flask路由-指定HTTP方法核心概念与机制默认行为:Flask路由默认仅响应GET请求。指定方法:通过methods参数可以指定允许的HTTP方法列表(如['GET','POST'])。逻辑分支:利用request.method判断请求类型,实现不同的业务逻辑(如GET展示表单,POST处理数据)。代码实现示例(Login)fromflaskimportrequest@app.route('/login',methods=['GET','POST'])deflogin():ifrequest.method=='POST':#处理登录逻辑...username=request.form.get('username')returnf"欢迎{username}"8.4.2Flask路由-URL构建核心机制:动态构建函数作用:使用url_for()函数,传入视图函数名作为参数,动态生成对应的URL字符串。优势特点:避免硬编码URL,提升代码可维护性。当路由规则变更时,所有生成的URL会自动更新。参数传递:支持传递动态参数,例如url_for('user',id=1)可生成/user/1。代码示例:生成动态链接fromflaskimporturl_for

@app.route('/')defhome():#生成指向用户页面的URLuser_url=url_for('show_user',username='bob')#生成指向文章页面的URLpost_url=url_for('show_post',post_id=100)returnf"<ahref='{user_url}'>访问Bob</a>"8.4.2Flask路由-请求钩子before_first_request在处理第一个请求之前运行,通常用于初始化数据库连接或加载配置等一次性操作。before_request在每次请求处理之前运行,常用于用户认证、请求预处理等需要在视图函数执行前完成的逻辑。after_request在每次请求之后运行(无未处理异常时),常用于添加响应头、记录正常请求日志等。teardown_request在每次请求之后运行(即使有未处理异常),用于确保资源被释放,如关闭数据库连接。8.4.2Flask路由-请求钩子示例app.py-请求钩子实现fromflaskimportFlask,g,requestimporttimeapp=Flask(__name__)#1.应用初始化:处理第一个请求前执行@app.before_first_requestdefinit_app():print("应用初始化...")#2.请求预处理:记录开始时间@app.before_requestdefstart_timer():g.start_time=time.time()#3.请求后处理:计算耗时并添加响应头@app.after_requestdeflog_request(response):duration=time.time()-g.start_timeresponse.headers['X-Response-Time']=f'{duration:.2f}s'returnresponse8.4.3蓝图(Blueprints)-基本概念核心定义与作用组织方式:用于组织路由和视图的模块化工具,允许将大型应用分解为多个组件。独立特性:每个蓝图拥有独立的路由、模板和静态文件,如同一个独立的小应用。结构优化:通过划分功能模块(如认证、博客),使项目结构清晰,易于维护。通俗理解蓝图本质上就是Flask应用的“模块”或“插件”。它解决了单一文件路由管理困难的问题,让开发者可以像搭积木一样构建复杂的Web应用。8.4.3蓝图-创建蓝图创建步骤解析导入Blueprint类:从flask库中引入核心类创建实例:初始化蓝图,指定名称和模块定义路由:使用@蓝图名.route装饰器绑定视图函数auth.py-认证蓝图示例#导入必要的模块fromflaskimportBlueprint#创建蓝图实例auth_bp=Blueprint('auth',__name__)#定义路由与视图函数@auth_bp.route('/login')deflogin():

return'登录页面'@auth_bp.route('/logout')deflogout():

return'登出页面'总结:蓝图将路由模块化,使大型应用的结构更加清晰。8.4.3蓝图-注册蓝图注册机制与路由前缀核心方法:使用app.register_blueprint()将蓝图挂载到主应用。路由前缀:通过url_prefix参数为蓝图下的所有路由添加统一前缀(如'/auth'),避免命名冲突。访问示例:注册后,访问/auth/login将调用蓝图中的login视图函数。代码示例(app.py)#导入必要的模块和蓝图

fromflaskimportFlask

fromauthimportauth_bp

app=Flask(__name__)

#关键步骤:注册蓝图并设置前缀

app.register_blueprint(auth_bp,url_prefix='/auth')

@app.route('/')

defhome():

return'首页'8.4.3蓝图-模板和静态文件蓝图支持独立的模板和静态文件目录,通过参数指定,实现高度模块化开发。独立模板目录使用template_folder参数指定蓝图专属的HTML模板位置。独立静态资源使用static_folder参数指定CSS、JS等静态文件的存储目录。Python代码示例#创建蓝图实例blog_bp=Blueprint('blog',__name__url_prefix='/blog'template_folder='templates/blog',static_folder='static/blog')#路由视图函数@blog_bp.route('/')defindex():returnrender_template('index.html')8.5Flask模板模板引擎是实现前后端分离,展示动态内容的关键。8.5.1模板引擎介绍核心引擎:Jinja2Flask默认使用的模板引擎,支持变量、控制结构(条件/循环)及模板继承等高级特性。分离关注点将业务逻辑(Python代码)与表现逻辑(HTML代码)解耦,便于团队协作与维护。代码复用通过模板继承机制,复用页眉、页脚等公共组件,减少重复代码,提升开发效率。动态内容轻松嵌入Python变量和计算结果,实现页面内容的动态生成与展示。在Flask中,使用render_template()函数来渲染模板文件。8.5.2模板基本语法-变量后端逻辑(app.py)fromflaskimportFlask,render_templateapp=Flask(__name__)@app.route('/user/<name>')defuser(name):#将变量传递给模板returnrender_template('user.html',username=name,age=25)前端模板(templates/user.html)<!DOCTYPEhtml><html><body><h1>欢迎,{{username}}!</h1><p>你的年龄是:{{age}}</p></body></html>核心语法:在模板中使用{{变量名}}语法来输出变量值,Flask会自动将后端传递的变量替换到对应位置。8.5.2模板基本语法-控制结构Jinja2支持在模板中使用{%...%}语法来编写控制结构,如条件判断和循环。模板代码(control.html){#条件判断#}{%ifage>=18%}<p>你是成年人。</p>{%else%}<p>你是未成年人。</p>{%endif%}

{#循环遍历列表#}{%forfruitinfruits%}<li>{{fruit}}</li>{%endfor%}后端数据传递(Python)@app.route('/control')defcontrol():returnrender_template('control.html',age=20,fruits=['苹果','香蕉','橙子'])8.5.3模板继承父模板(base.html)<!--定义基础结构和可替换块--><title>{%blocktitle%}默认标题{%endblock%}</title>

<divclass="header">公共页眉</div><divclass="content">{%blockcontent%}{%endblock%}</div><divclass="footer">公共页脚</div>子模板(index.html)<!--继承父模板并填充内容-->{%extends"base.html"%}

{%blocktitle%}首页{%endblock%}

{%blockcontent%}<h1>欢迎来到首页</h1><p>这是首页的具体内容。</p>{%endblock%}8.6Flask表单表单是用户与Web应用交互的重要方式,Flask-WTF简化了表单处理。8.6.1Flask-WTF介绍表单验证轻松定义表单字段和验证规则,通过Python类实现表单逻辑,代码清晰易维护。CSRF保护自动生成和验证CSRF令牌,有效防止跨站请求伪造攻击,提升Web应用安全性。文件上传支持内置文件上传处理功能,简化了文件类型验证和存储流程,使用便捷高效。Flask深度集成与Flask框架无缝对接,可直接在视图函数和模板中使用,保持开发体验的一致性。8.6.2定义表单类核心概念与实现继承基类:创建一个继承自FlaskForm的Python类。字段定义:每个表单字段作为类属性定义,如StringField。验证规则:通过validators参数指定验证器,如DataRequired、Length等。代码示例(forms.py)classLoginForm(FlaskForm):username=StringField('用户名',validators=[DataRequired(message='不能为空'),Length(min=4,max=20)])password=PasswordField('密码',validators=[DataRequired()])submit=SubmitField('登录')8.6.3在模板中渲染表单核心渲染机制CSRF令牌保护使用form.hidden_tag()自动渲染隐藏字段,提供安全防护。表单字段生成通过form.field.label和form.field()自动生成标签与输入框。错误信息展示遍历form.field.errors循环显示验证失败的具体信息。代码示例(templates/login.html)<!--渲染CSRF令牌-->{{form.hidden_tag()}}<!--用户名输入框-->{{form.username.label}}<br>{{form.username(size=32)}}<!--错误信息循环显示-->{%forerrorinform.username.errors%}<spanstyle="color:red;">{{error}}</span>{%endfor%}8.6.4处理表单提交在视图函数中,我们需要处理表单的POST请求,验证表单数据,并根据验证结果做出响应。@app.route('/login',methods=['GET','POST'])deflogin():form=LoginForm()ifform.validate_on_submit():#检查请求方法并执行验证#处理登录逻辑,例如验证用户名密码username=form.username.dataifusername=='admin':return"登录成功!"returnrender_template('login.html',form=form)核心方法:form.validate_on_submit()会自动检查请求是否为POST,并执行所有字段的验证器。8.7Flask数据库操作Flask-SQLAlchemy为Flask应用提供了强大的ORM支持,简化数据库操作。8.7.1Flask-SQLAlchemy介绍Flask-SQLAlchemy是Flask的一个扩展,它是SQLAlchemy的Flask集成版本。它提供了一种将Python对象映射到数据库表的方式,使得开发者可以用面向对象的方式来操作数据库,无需编写复杂的SQL语句。简化数据库操作无需编写复杂的SQL语句,通过Python类和对象即可完成数据的增删改查。支持多种数据库兼容SQLite、MySQL、PostgreSQL等多种主流数据库,灵活适配不同环境。强大的查询功能提供丰富的查询API,支持链式调用,轻松构建复杂的数据库查询逻辑。与Flask无缝集成与Flask应用深度集成,配置简单,上下文管理完善,使用体验流畅。8.7.2配置数据库连接config.py-核心配置代码fromflaskimportFlaskfromflask_sqlalchemyimportSQLAlchemyapp=Flask(__name__)#配置数据库连接URI(SQLite)app.config['SQLALCHEMY_DATABASE_URI']='sqlite:///my_database.db'app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=False#初始化SQLAlchemy对象db=SQLAlchemy(app)核心配置参数通过设置`SQLALCHEMY_DATABASE_URI`来指定数据库的位置和类型。同时建议关闭`TRACK_MODIFICATIONS`以节省内存。多数据库支持示例中使用的是SQLite。若使用MySQL,URI格式如下:mysql+pymysql://user:pass@host/db_name8.7.3定义数据模型核心概念数据模型是数据库表的Python映射,通过继承db.Model类来定义。每个类属性对应数据库表中的一个字段。示例中定义了User模型,对应数据库中的users表,包含id、username、email和password四个字段。代码实现(Python)classUser(db.Model):__tablename__='users'id=db.Column(db.Integer,primary_key=True)username=db.Column(db.String(80),unique=True)email=db.Column(db.String(120),unique=True)password=db.Column(db.String(128))def__repr__(self):returnf'<User{self.username}>'8.7.4创建数据库表核心操作流程创建表结构:定义好数据模型后,在Python交互环境中执行`db.create_all()`即可自动生成所有表。生成文件:若使用SQLite,项目目录下会生成`my_database.db`文件。进阶建议:大型项目推荐使用Flask-Migrate管理数据库迁移。代码示例#进入Python交互环境$python#导入应用和数据库实例>>>fromappimportapp,db#创建所有表>>>withapp.app_context():...db.create_all()8.7.5数据库基本操作-CRUD1.创建(Create)new_user=User(username='john',email='john@')db.session.add(new_user)#添加到会话mit()#提交写入数据库2.读取(Read)all_users=User.query.all()#查询所有user=User.query.get(1)#主键查询user=User.query.filter_by(username='john').first()3.更新(Update)user=User.query.filter_by(username='john').first()user.email='new_john@'mit()#提交更新4.删除(Delete)user=User.query.filter_by(username='john').first()db.session.delete(user)#删除对象mit()#提交删除8.8FlaskWeb应用开发实战通过一个完整的项目案例,综合运用所学知识,构建一个功能完整的Web应用。8.8.1项目需求分析用户认证实现用户注册、登录和退出功能,确保系统安全性与用户身份识别。博客管理支持登录用户发布新文章,并对已有文章进行编辑和删除操作。文章展示所有用户均可访问博客首页列表,查看具体文章内容,提供良好的阅读体验。数据持久化将用户信息、文章内容等核心数据存储在数据库中,确保数据不丢失。8.8.2项目结构设计设计理念与优势模块化设计:采用蓝图(Blueprint)组织功能模块,实现关注点分离。清晰分层:数据模型、路由视图、表单定义、静态资源各司其职。易于扩展:结构清晰便于团队协作,支持后续功能模块的快速迭代。项目目录结构概览blog_project/├──app/(核心应用模块)│├──models/(数据模型定义)│├──routes/(蓝图路由:auth.py,blog.py)│├──forms/(表单验证定义)│├──static/&templates/(静态资源与模板)├──migrations/(数据库迁移文件)├──config.py(全局配置文件)└──run.py(项目启动入口)8.8.3数据库模型设计User模型(用户)classUser(db.Model):id=db.Column(db.Integer,primary_key=True)username=db.Column(db.String(80),unique=True)email=db.Column(db.String(120),unique=True)password=db.Column(db.String(128))#关联关系:一对多posts=db.relationship('Post',backref='author')Post模型(文章)classPost(db.Model):id=db.Column(db.Integer,primary_key=True)title=db.Column(db.String(100),nullable=False)content=db.Column(db.Text,nullable=False)date_posted=db.Column(db.DateTime,default=utcnow)#外键关联User.iduser_id=db.Column(db.Integer,db.ForeignKey('user.id'))8.8.4蓝图与路由实现认证蓝图(app/routes/auth.py)#导入必要模块auth_bp=Blueprint('auth',__name__,url_prefix='/auth')@auth_bp.route('/register',methods=['GET','POST'])defregister():#处理用户注册逻辑,表单验证与数据库写入@auth_bp.route('/login',methods=['GET','POST'])deflogin():#验证用户凭据,实现登录状态管理博客蓝图(app/routes/blog.py)#导入必要模块

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论