目录
Web标准
前端则指的是直接与用户接触的网页,比如布局、特效、交互 后端指的是程序、数据库和服务器层面的开发
网页部分的标准通过三部分来描述:结构、表现和行为
HTML 用来决定网页的结构和内容; CSS 用来设计网页的表现形式; JavaScript 用来控制网页的行为。
发展阶段 静态页面、动态页面、web脚本语言、web框架
常用的脚本语言 Java、c#、php、c++、python、JavaScript
Django几乎所有的功能都帮助开发者写好了,部署网站的时候会导致很多不必要的功能也部署进来。
Flask是一个轻量级的框架,一些核心的功能实现了,但是实现的功能并没有Django那么多
Java框架:ssm和ssh HTML:超文本标记语言是标记语言
组成表单的元素:文本字段、复选框、单选项、按钮、列表和菜单等
Css简介内联样式表、内部样式表、外部样式表
Flask简介
Flask是一个用Python编写的微框架,它可以帮助开发者在短时间内完成一个功能丰富的Web应用程序。
Flask默认依赖两个外部库:Werkzeug WSGI工具包和Jinja2模板引擎,它只保留了Web开发的核心功能,而不包括用户认证、表单验证、发送邮件等其他Web应用程序框架通常包含的功能。
路由与视图
路由是一种Web框架中应用的技术,用于帮助用户直接根据URL访问某个页面,而无须再从主页导航到这个页面。
通过访问字典元素的方式使用配置文件
若希望一次修改多个配置项,则可以调用flask.Config从父类继承的update()方法实现。例如,通过为Flask类的对象app设置配置项TESTING和SECRET_KEY,从而为程序启用测试模式以及设置密钥,具体代码如下所示。
app.config.update(
TESTING=True,
SECRET_KEY=b'_5#y2L"F4Q8z\n\xec]/')
通过导入文件的方式使用配置文件
flask.Config类中提供了一些从文件中导入配置项的方法from_file():从指定的文件中导入配置项,并更新配置项的值。
from_pyfile():从py文件中导入配置项,并更新配置项的值。
# 通过from_file()方法从config.json文件中导入配置项
import json
app.config.from_file("config.json", load=json.load)
# 通过from_pyfile()方法从config.py文件中导入配置项
app.config.from_pyfile("config.py")
通过导入对象的方式使用配置信息
from_object()方法用于从给定对象中导入配置项,并更新配置项的值。需要说明的是,from_object()方法只会加载Python类中以大写字母命名的属性。如果Python类中有一个@property属性,该类在被传递给from_object()方法之前需要进行实例化。
注册路由
在Flask程序中,浏览器通过URL发送HTTP请求给Web服务器,Web服务器再将HTTP请求转发给Flask程序。Flask程序接收到HTTP请求后,需要知道Flask程序中哪部分代码对这个请求进行处理。为此,Flask程序保存了一个URL与视图函数或类的映射关系,建立映射关系的过程称为注册路由。
通过add_url_rule ()方法注册路由
下面通过示例代码,演示add_url_rule()方法注册路由,使视图函数与URL建立关联。
from flask import Flask
app = Flask(__name__)
def index_new():
return f'<h1>这是首页!</h1>'
app.add_url_rule(rule='/index', view_func=index_new)
if __name__ == '__main__':
app.run()
URL传递参数的方式
当调用route()或add_url_rule()方法注册路由时,可以在URL规则字符串中加入尖括号包裹的变量,用于标记URL中动态变化部分的内容,之后将该变量作为参数传递给视图函数。(动态路由)
<variable_name>
variable_name表示变量名。
from flask import Flask
app = Flask(__name__)
@app.route('/<page>')
def page_num(page):
return f'当前为第{page}页'
if __name__ == '__main__':
app.run()
内置转换器
- @app.route('/index')
def index():
if 'username' in session:
return f'你好:{session.get("username")}'
return '请登录'
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
session['username']=request.form['username']
return '登录成功'
return
<form method="post">
<p><input type=text name=username>
<p><input type=submit value='登录'>
</form>
实现表现逻辑和业务逻辑分离的效果。
模板与模板引擎Jinja2
它可以生成任何基于文本格式的文件,比如HMTL、XML、CSV
模板引擎用于识别模板中的特殊语法标记,它会结合请求上下文环境将变量替换为真实的值,生成最终的HTML页面渲染。
Flask默认模板引擎是Jinja2,它除了允许在模板中使用变量之外,还允许在模板中使用过滤器、选择结构、控制结构、宏等
模板变量
模板变量是一种特殊的占位符,它用于标识模板中会动态变化的数据,当模板被渲染时,模板引擎将模板中的变量替换为由视图函数传递的真实数据。
{{ variable }}
过滤器
在Jinja2中,过滤器是用于修改或过滤模板变量值的特殊函数,使用过滤器可以获取更精确的数据。
{{ variable|filter(parameter) }}
filter(parameter)表示使用的过滤器,其中parameter表示传递给过滤器的参数,变量名称和过滤器之间使用竖线分隔。一个模板变量可以使用多个过滤器,多个过滤器之间使用竖线分隔。
内置过滤器
通过一个案例分演示内置过滤器的用法。
在app.py文件中,定义视图函数use_of_filters()以及触发该函数的URL规则/filters,在视图函数use_of_filters()中向模板传递不同类型的数据。
@app.route('/filters')
def use_of_filters():
num = -2.3
li = [2, 1, 5, 6, 7, 4, 4]
string = 'flask'
return render_template('filters.html', num=num, li=li, string=string)
自定义一个实现反转列表元素的过滤器。
def custom_filters(data):
return data[::-1]
使用装饰器app.template_filter()可以将自定义过滤器注册到过滤器列表中,template_filter()方法中包含一个可选参数name,该参数表示过滤器的名称,默认值为被装饰的函数名。
宏的定义
宏与Python函数类似,它可以传递参数,但没有返回值,模板中的宏以macro标识开始,以endmacro标识结束。
{% macro 宏的名称(参数列表)%}
宏内部逻辑代码
{% endmacro %}
多个参数之间使用逗号进行分隔;宏内部可以嵌套使用前文介绍的过滤器、选择结构、循环结构等。
消息闪现
flash()函数和get_flashed_message()函数实现消息闪现
(1)在app.py文件中定义视图函数home_page(),该函数用于判断用户的登录状态。
from flask import Flask, render_template
from flask import flash, redirect, session, request, url_for
app.secret_key = 'Your_secret_key&^52@!'
@app.route('/home')
def home_page():
username = session.get('username')
if 'username' in session:
return render_template('home_page.html', username=username)
return redirect(url_for('login'))
模板继承
模板继承通过block和extends实现,其中block用于标识与继承机制相关的代码块,extends用于指定子模板所继承的基模板。{% extends 基模板名称 %}必须位于子模板的第一行
数据库的增删查改
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:1234567@127.0.0.1/student'
db = SQLAlchemy(app)
class Student(db.Model):
sid = db.Column(db.Integer, primary_key=True)
sname = db.Column(db.String(20), unique=True, nullable=False)
score = db.Column(db.Float, nullable=False)
添加数据
def hello_flask():
user1 = Student(sid="221188100101", sname='张三', score=66)
db.session.add_all([user1, user2, user3])
db.session.commit()
return "OK"
更新数据
def hello_flask():
result = Student.query.filter_by(sname='张三').first()
print(result.sname)
result.sname = "张龙"
db.session.commit()
return "OK"
查询数据
def hello_flask():
students = Student.query.all()
for student in students:
print(student.sname)
first_student = Student.query.first()
print(first_student.sname)
return "OK"
删除数据
def hello_flask():
result = Student.query.filter_by(sname='小张').first()
print(result.sname)
db.session.delete(result)
db.session.commit()
return "OK"
别忘记写 注册路由和app.run