当前位置:   article > 正文

flask+python开发框架的前后端交互_python前后端开发

python前后端开发

flask是一个用python编写的web应用程序框架

一、flask项目结构

总结:文件结构:static、templates 放置前端代码;app.py用于写后端代码。

Flask程序的基本构造:

通过render_template,打开前端的html网页。

  1. from flask import Flask,render_template
  2. app = Flask(__name__)
  3. @app.route('/')
  4. def index():
  5. return render_template('demo.html')
  6. if __name__ == '__main__':
  7. app.run()

二、路由的使用

总结:render-template是渲染模块,用于前端的页面渲染。

动态路由,用于get请求的前端传值。

  1. # 路由传递参数
  2. @app.route('/user/<user_id>')
  3. def user_info(user_id):
  4. return 'hello %s' % user_id
  5. # 路由传递的参数默认当做 string 处理,也可以指定参数的类型
  6. # 路由传递参数
  7. @app.route('/user/<int:user_id>')
  8. def user_info(user_id):
  9. return 'hello %d' % user_id
  10. @app.route('/content', methods=['POST', 'GET'])
  11. def ShowDMZContent():
  12. # 获取客户端键为fsp的GET请求
  13. chapterurl = request.args.get('dmzurl')
  14. # print(chapterurl)
  15. #pachong.getChapter自己写的方法,被调用
  16. content = pachong.getChapter(chapterurl)
  17. # print(content)
  18. return render_template('new3.html', contentx=content[0],href=content[1])
  19. #前端请求:http://127.0.0.1:5000/content?dmzurl=/xs_3366/2211751.html

三、jinja2引擎模板

总结:动态网页,可能有部分内容数据是后台提高,是动态的内容。

在函数中传递参数,在HTML页面中,利用{{}}获取传递的参数。

传参时,列表和字典的使用:

  1. @app.route('/', methods=['GET', 'POST'])
  2. def user():
  3. user_var="程序设计类辅助实验教学平台"
  4. list_test=['这是list的1','这是list的2','这是list的3','这是list的4','这是list的5']
  5. dict_test={
  6. 'name': "这是测试name",
  7. 'key': "这是测试key"
  8. }
  9. return render_template('demo3.html', html_var=user_var,list_test=list_test,dict_test=dict_test)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mPgyPAlk-1581604100658)(evernotecid://5DBAB900-A080-44B3-994E-762E3B8C44D4/appyinxiangcom/22161713/ENResource/p554)]

前端: 

1、控制语句

在{% %}中进行写控制语句

  1. {% for num in list_test %}
  2. {% if num > 2 %}
  3. {{ num }}<br>
  4. {% endfor %}

2、过滤器的基本使用

{{ var_test|upper }}

常见的过滤器

过滤器名说明
safe渲染时不转义
capitalize把值的首字母大写,其余小写
lower把值转换成小写形式
upper把值转换成大写形式
title把值中每个单词的首字母都转换成大写
trim把值的首位空格去掉
striptags渲染之前把值中所有的HTML标签删掉

web表单

使用Flask-WTF扩展

使用flash传递消息

  1. from flask import Flask,render_template,request,flash
  2. app = Flask(__name__)
  3. #app.secret_key是对内容加密的指定的语句,设置secret_key,做加密消息混淆
  4. app.secret_key='this is a secret key'
  5. @app.route('/', methods=['GET', 'POST'])
  6. def user():
  7. #request请求对象,包括请求方式,数据等
  8. #flash需要对内容加密,因此要设置secret_key,做加密消息混淆
  9. if request.method == 'POST':
  10. username=request.form.get('username')
  11. password1=request.form.get('password1')
  12. password2=request.form.get('password2')
  13. if not all([username,password1,password2]):
  14. #return '参数不完整'
  15. flash('参数不完整')
  16. elif password1 == password2:
  17. #return 'true'
  18. flash("true")
  19. else:
  20. #return 'false'
  21. flash("false")
  22. return render_template('demo3.html')
  23. if __name__ == '__main__':
  24. app.run()

在这里插入图片描述

使用WTF实现web表单
WTForms支持的HTML标准字段
字段类型    说明
BooleanField    复选框,值为True和False
DateField    文本字段,值为datetime.date格式
DareTimeField    文本字段,值为datetime.datetime格式
FileField    文件上传字段
HiddenField    隐藏的文本字段
MultipleFileField    多文本上传字段
FieldList    一组指定类型的字段
FloatField    文本字段,值为浮点数
FormField    把一个表单作为字段嵌入另一个表单
IntegerField    文本字段,值为整数
PasswordField    密码文本字段
RadioField    一组单选按钮
SelectField    下拉列表
SelectMultipleField    下拉列表,可选择多个值
SubmitField    表单提交按钮
StringField    文本字段
TextAreaField    多行文本字段
WTForms验证函数
验证函数    说明
DateRequired    确保转换类型后字段中有数据
Email    验证电子邮件地址
EqualTo    比较两个字段的值,常用于要求输入两次密码进行确认的时候
InputRequired    确保转换类型前字段中有数据
IPAddress    验证IPv4网络地址
Length    验证输入字符串的长度
MacAddress    验证MAC地址
NumberRange    验证输入的值在数字范围之内
Optional    允许字段中没有输入,将跳过其他验证函数
Regexp    使用正则表达式验证输入值
URL    验证URL
UUID    验证UUID
AnyOf    确保输入值在一组可能的值中
NoneOf    确保输入值不在一组可能的值中
Flask-WTF扩展的安装

在PyCharm中打开Preferences打开Project选项板
进行Project Interpreter设置
点击添加‘+’,然后搜索Flask-WTF选择好版本之后,Install Package,拓展包就添加完成了


在项目中导入Flask-WTF 

from flask_wtf import FlaskForm

在项目中导入Flaks-WTF的HTML标准字段

from wtforms import StringField,PasswordField,SubmitField

在项目中导入Flask-WTF的验证函数

from wtforms.validators import DataRequired, EqualTo

在使用Flask-WTF拓展的时候,需要使用CSRF Token
在html页面中加入

{{ html_form.csrf_token() }}

使用Flask-WTF创建表单示例
 

  1. from flask import Flask, render_template, request, flash
  2. from flask_wtf import FlaskForm
  3. from wtforms import StringField, PasswordField, SubmitField
  4. from wtforms.validators import DataRequired, EqualTo
  5. app = Flask(__name__)
  6. app.secret_key = "dsauhfabf"
  7. class LoginForm(FlaskForm):
  8. username = StringField('用户名', validators=[DataRequired()])
  9. password1 = PasswordField('密码', validators=[DataRequired()])
  10. password2 = PasswordField('确认密码', validators=[DataRequired(), EqualTo('password1', "两次密码填入不一致")])
  11. submit = SubmitField('提交')
  12. @app.route('/form', methods=['GET', 'POST'])
  13. def login():
  14. login_form = LoginForm()
  15. if request.method == 'POST':
  16. username = request.form.get('username')
  17. password1 = request.form.get('password1')
  18. password2 = request.form.get('password2')
  19. if login_form.validate_on_submit():
  20. return 'success'
  21. else:
  22. flash("false")
  23. return render_template('demo3.html', html_form=login_form)
  24. if __name__ == '__main__':
  25. app.run()
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <form method="post">
  9. <br>
  10. {{ html_form.csrf_token() }}
  11. {{ html_form.username.label }}{{ html_form.username }}<br>
  12. {{ html_form.password1.label }}{{ html_form.password1 }}<br>
  13. {{ html_form.password2.label }}{{ html_form.password2 }}<br>
  14. {{ html_form.submit }}<br>
  15. {% for message in get_flashed_messages() %}
  16. {{ message }}
  17. {% endfor %}
  18. </form>
  19. </body>
  20. </html>

四、数据库框架sqlaichemy

Flask-SQLAlchemy拓展

使用Flask-SQLAichemy可以处理Python对象,而不是数据实体

安装方法:
通过PyCharm的project interpret 继续安装
通过命令行进行安装
 pip install flask-sqlalchemy

在Flask-SQLAlchemy中,数据库使用URL进行指定,MySQL的URL格式为:

mysql://username:password@hostname/datebase

例如 mysql://root:password@127.0.0.1:3306/demoDatabse

安装pymysql
pip install pymysql

配置数据库:

  1. def mysql_db():
  2. # 连接数据库肯定需要一些参数
  3. conn = pymysql.connect(
  4. host="localhost",
  5. port=3306,
  6. db="users",
  7. charset="utf8",
  8. user="root",
  9. password="Ab123456",
  10. # ssl={'ssl': {}}
  11. )
  12. # print('连接上了!')

数据库封装的代码:

  1. import pymysql
  2. class Mysql_Object():
  3. def __init__(self,host,user,password,database,port=3306,charset='utf8'):
  4. self.host=host
  5. self.user=user
  6. self.password=password
  7. self.database=database
  8. self.port=port
  9. self.charset=charset
  10. def select_sql(self,sql,size=0):
  11. '''
  12. 查询sql语句
  13. :param sql 传入查询的sql语句,字符串
  14. :param size 返回结果的记录条数,如果没有输入默认输出全部条数
  15. :return: self.count 返回查询的记录的总数,slef.res 返回查询的结果
  16. '''
  17. self.con=pymysql.connect(host=self.host,user=self.user,password=self.password,database=self.database,port=self.port,charset=self.charset)
  18. self.cur=self.con.cursor() #建立游标
  19. self.sql=sql
  20. # 判读是否是查询语句
  21. if self.sql.startswith('select' or 'SELECT'):
  22. self.cur.execute(self.sql) #获取数据库结果
  23. self.count=self.cur.rowcount #统计查询记录数
  24. # 通过if语句进行判断
  25. if size == 0:
  26. self.res=self.cur.fetchall() #输出全部结果
  27. elif size != 0 :
  28. self.res=self.cur.fetchmany(size) #输出指定数值
  29. else:
  30. print('执行失败')
  31. self.cur.close()
  32. self.con.close() #关闭连接
  33. return self.count,self.res
  34. def excute_sql(self,sql):
  35. '''
  36. :param sql 输入增删改的sql语句
  37. :return:
  38. '''
  39. self.con = pymysql.connect(host=self.host, user=self.user, password=self.password,port=self.port, database=self.database,
  40. charset=self.charset,autocommit=True)
  41. self.cur = self.con.cursor() # 建立游标
  42. self.sql = sql
  43. if self.sql.startswith('insert' or 'INSERT'):
  44. print('插入语句',self.sql)
  45. self.cur.execute(self.sql) #执行语句
  46. self.cur.close() #关闭连接
  47. self.con.close()
  48. elif self.sql.startswith('delete' or 'DELETE'):
  49. print('删除语句',self.sql)
  50. self.cur.execute(self.sql) # 执行语句
  51. self.cur.close() # 关闭连接
  52. self.con.close()
  53. elif self.sql.startswith('update'or 'UPDATE'):
  54. print('更新语句',self.sql)
  55. self.cur.execute(self.sql) # 执行语句
  56. self.cur.close() # 关闭连接
  57. self.con.close()
  58. else:
  59. print('执行失败')
  60. # if __name__ == '__main__':
  61. # # 调用
  62. # m = Mysql_Object('localhost', 'root', 'Ab123456', 'users')
  63. # print(m.select_sql('select * from username', 1)) # 查询结果
  64. # m.excute_sql('update users.username set passwd="4444" where `username`="张12"') # 更新语句
  65. # # m.excute_sql('delete from users.username where username="赵六"') # 删除语句
  66. # m.excute_sql('insert INTO users.username VALUES (NULL, "2023-06-08 00:00:00", "赵六", "123456", NULL)')
  67. # # 插入语句

主函数调用的时候需要,import数据库封装的类,调用需要实例化一下。

sql="insert INTO users.novelname VALUES (NULL,'%s','%s')" %(c[0] ,c[1])

Mysql_Object().excute_sql(sql=sql)

 模糊查询like的用法

  1. m = Mysql_Object('localhost', 'root', 'Ab123456', 'users')
  2. name='%'+'噬'+'%'
  3. print(name)
  4. sql='select * from novelname where name like "%%%s%%"'%name
  5. print(m.select_sql(sql,0)) # 查询结果

五、echarts可视化

疑问:

六、运行flask

windows:命令窗口

  1. set FLASK_APP=blog
  2. set FLASK_ENV=develipment
  3. flask run
  4. #端口被占用的话,flask run -p 50001

七、调整HTML样式

static下面新建一个css,再新增一个:style.css

八、使用模板文件

继承的作用就是为了少写一些重复的代码,例如导航栏的实现就需要在模板中定义一个导航栏,其他页面使用继承即可:

新建一个base.html,而block main的部分就是导航栏下每个页面不同的接口,由每个页面负责实现。

剩下的index和login页面通过对base的继承即可

base.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>{% block title%}{%endblock%}</title>
  6. <style>
  7. .nav{
  8. background:#3a3a3a;
  9. height:70px
  10. }
  11. ul{
  12. overflow:hidder;
  13. }
  14. ul li{
  15. float:left;
  16. list-style:none;
  17. padding:0 10px;
  18. line-height:70px;
  19. }
  20. ul li a{
  21. color:#fff;
  22. }
  23. </style>
  24. </head>
  25. <body>
  26. <div class="nav">
  27. <ul>
  28. <li><a href="#">INDEX</a></li>
  29. <li><a href="#">QUESTION</a></li>
  30. </ul>
  31. </div>
  32. {% block main %}
  33. {% endblock %}
  34. </body>
  35. </html>

index.html中应用base.html文件中的基本格式。

extends是模板继承。

  1. {% extends "base.html" %}
  2. {% block title %}
  3. index
  4. {% endblock %}
  5. {% block main %}
  6. 首页<br>
  7. 下说列表<br>
  8. <a href="./sw" target="dmzcontent">元尊 </a>
  9. {% endblock %}

写重复代码的函数:

with open。。as f使用:

  1. def saveCatalog(cataloglist):
  2. # 打开文件写入内容
  3. with open("sw.txt", 'w+', encoding="utf-8") as f:
  4. for c in cataloglist:
  5. # print(c[0])
  6. f.write(c[0] +'\n')

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/66551
推荐阅读
相关标签
  

闽ICP备14008679号