python的flask框架基础1
一.flask引入
1.flask的示例程序
from flask import Flask
app=Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello,World!'
if __name__=='__main__':
app.run(debug=True)
对这段代码的解释
1.from flask import Flask
从flask模块中导入Flask这个特定的类,你也可以直接from flask import *,不过from flask import Flask只导入了需要的部分,避免了不必要的模块加载,提高了性能,尤其是在较大的项目中。
并且保持了命名空间的干净,不会意外的导致一些名字相同的函数或者变量。
2.app=Flask(name)
#创建一个名为app的Flask实例,也可以创建为其它名字
3.if name==‘main’:
检查当前模块是否在主程序中运行,作用是在直接运行脚本时执行某些特定的代码,而当这个脚本被其他模块导入时不会执行这些代码。
4.app.run(debug=True)
启动了开发服务器,并启用了调试模式,使应用可以在开发过程中方便地调试和修改。 Flask会在代码修改后自动重新加载应用
2.flask命令运行程序
–debug用于启动调试器
–app用于指定路径,run用于跑
–host=0.0.0.0,如果想让服务被内网中的其他人访问可以加上
–port可用于指定端口
以上这些也可以直接在代码中添加
app.run(debug=True,host=‘0.0.0.0’,port=8080)
二.前端页面相关
1.HTML的转义
from markupsafe import escape
@app.route("/<name>")
def hello(name):
return f"Hello, {escape(name)}!"
从 MarkupSafe 库中导入了 escape 函数。MarkupSafe 是一个用于防止HTML和JavaScript注入攻击的库,Flask默认会使用它来确保用户输入不会包含恶意代码。
escape() 函数:这个函数的作用是对用户输入进行“转义”(escaping),即将特殊字符(如 <, >, &, " 等)转换为安全的HTML实体,从而避免将用户输入直接作为HTML代码渲染在页面上,防止XSS(跨站脚本攻击)等安全问题。
如果用户输入的 name 是 ,在不使用 escape() 的情况下,这段代码可能会被当作真正的JavaScript代码在浏览器中执行,造成安全隐患。
下面尝试一下Flask与前端联动
这里补充一下render_template函数
Flask 中的 render_template 函数是用于渲染 HTML 模板 的函数。它的核心功能是通过 Flask 的模板引擎 Jinja2 将模板文件(通常是 HTML 文件)与动态传递的变量结合起来,生成完整的 HTML 响应并返回给客户端。
from flask import Flask, request,render_template
from markupsafe import escape
app = Flask(__name__)
@app.route('/')
def index():
return render_template('page/index.html',name='miststar')
@app.route('/id')
def test():
name = request.args.get('name')
return f'{name}'
if __name__ == '__main__':
app.run(debug=True)
项目中既有 HTML 文件,又有 CSS、JavaScript (JS) 等文件时,Flask 仍然可以很好地支持这些静态资源。Flask 默认提供了静态文件的处理机制,你可以将 CSS、JS 等静态资源文件放在项目的 static/ 目录下,然后在 HTML 模板中引用这些静态资源。
这里需要将index.html中的引入内容改为CSS为
CSS
<linkrel="stylesheet"href="{{ url_for('static', filename='css/bootstrap.min.css') }}">
JS
<script src="{{ url_for('static', filename='js/jquery-2.1.1.min.js') }}"></script>
图片
<img src="{{ url_for('static', filename='images/home/headimg.jpg') }}" alt="我的头像">
2.变量规则
把URL的一部分标记为<variable_name>即可以在URL中添加变量。。 标记的部分会作为关键字参数传递给函数。
通过使用converter:variable_name,可以选择性的加上一个转换器,为变量指定规则
示例程序
from markupsafe import escape
@app.route('/user/<username>')
def show_user_profile(username):
# show the user profile for that user
return f'User {escape(username)}'
@app.route('/post/<int:post_id>')
def show_post(post_id):
# show the post with the given id, the id is an integer
return f'Post {post_id}'
@app.route('/path/<path:subpath>')
def show_subpath(subpath):
# show the subpath after /path/
return f'Subpath {escape(subpath)}'
1.int:post_id 是带有类型转换的路径参数。int: 表示 Flask 期望 post_id 是一个整数。当用户访问 /post/123 时,123 会作为整数传递给视图函数 show_post。
2.path:subpath:
path: 是 Flask 的一种特殊路径类型,它会匹配多层次的路径部分,而不仅限于单个 URL 片段。例如,如果用户访问 /path/to/some/place,subpath 将捕获 to/some/place 作为参数。
转义的类型
3.唯一的URL/重定向行为
@app.route('/project/')
def project():
return 'test project'
@app.route('/about')
def about():
return 'test about'
访问一个没有斜杠结尾的 URL ( /projects )时 Flask 会自动进 行重定向,帮您在尾部加上一个斜杠( /projects/ )。
about 的 URL 没有尾部斜杠,因此其行为表现与一个文件类似。如果访问 这个 URL 时添加了尾部斜杠( /about/ )就会得到一个 404 “未找到” 错误。这样可以保持 URL 唯一,并有助于搜索引擎重复索引同一 页面。
4.URL构建
url_for()函数用于构建指定函数的url,把函数名称作为第一个参数。它可以接受任意个关键字参数,每个关键字参数对应 URL 中的变量。 未知变量将添加到 URL 中作为查询参数。
url_for()的基本作用是传递视图函数的名字,根据函数定义的路由来生成url
注意:
1.url_for中的参数必须是视图函数
2.url_for必须在请求上下文(Request Context)中,而不能在全局范围内调用
3.要在Flask中导入url_for
4.url_for()会自动在路径前添加/
每个路由对应的视图函数调用时,都会生成一个请求上下文,但更准确的说法是:每次 HTTP 请求都会创建一个请求上下文,并在请求的处理过程中与视图函数关联。
示例代码1
@app.route('/path/<path:subpath>')
def testpath(subpath):
return f'path is {escape(subpath)}'
@app.route('/')
def index():
return 'Hello,World!'
def gen():
url1 = url_for('testpath', subpath='a/c')
url2 = url_for('index')
return f'Generated URL 1: {url1}<br>Generated URL 2: {url2}'
如果想在return中多行输出可以直接使用HTML的换行标签
示例代码2
app.test_request_context() 是 Flask 提供的一个用于创建临时请求上下文的测试方法。
通常情况下,Flask 的请求上下文是在处理真实 HTTP 请求时自动创建的。
然而,url_for() 依赖于请求上下文来生成 URL,因此在没有真实请求的情况下(如脚本或测试中),我们需要使用 test_request_context() 来手动创建上下文。
from flask import Flask, request,render_template,url_for
from markupsafe import escape
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello,World!'
@app.route('/login')
def login():
return 'login'
@app.route('/user/<username>')
def profile(username):
return f'{username}\'s profile'
with app.test_request_context():
print(url_for('index'))
print(url_for('login'))
print(url_for('login',next='/'))
print(url_for('profile',username='blackstar'))
运行结果
next=‘/’ 是一个查询参数,它会被附加到生成的 URL 末尾作为查询字符串。具体地说,next 是查询参数的名称,而 ‘/’ 是该参数的值。
如果查询参数的名称是其他值,直接把next换为其它值
应用
● 用户访问 /dashboard(需要登录),如果未登录,他们会被重定向到 /login?next=/dashboard。
● 登录成功后,服务器会读取 next 参数,并将用户重定向回 /dashboard
HTTP方法
缺省情况下,一个路由只回应 GET 请求。可以使用 route() 装饰器的 methods 参数来处理不同的 HTTP 方法。
示例代码
@app.route('/submit',methods=['GET','POST'])
def submit():
if request.method=='POST':
#处理POST请求,例如提交表单数据
return 'Form submitted'
else:
#处理GET请求,例如返回一个表单页面
return 'please submit the form'
app.url_map 显示了 Flask 应用中的所有路由及其支持的 HTTP 方法。
with app.test_request_context():
print(url_for('index'))
print(url_for('login'))
print(url_for('login',re='/'))
print(url_for('profile',username='blackstar'))
print(app.url_map)
运行结果
因为app.url_map可以返回所有路由及其对应的HTTP方法,我这里尝试了一下类sql注入
@app.route('/id')
def test():
name = request.args.get('name')
return name
这里的示例路由
我的payload为 http://127.0.0.1:5000/id?name=111%27%20app.url_map%20#
但没有用
在 Flask 或其他现代 Web 框架中,传递给应用的查询参数只是字符串,服务器端不会自动将它们作为代码执行。参数 111’ app.url_map # 在这种情况下被视为普通字符串。视图函数处理的只是将该字符串赋值给 name 变量,并没有任何代码执行。
静态文件的调用
在 Flask 中引入 CSS 文件通常是通过 静态文件 机制实现的。Flask 提供了一个简单的方法来服务静态文件,比如 CSS、JavaScript、图片等。默认情况下,Flask 会将所有静态文件放在项目的 static 文件夹中。
在 HTML 文件中,使用 Flask 的 url_for() 函数来引用静态文件。url_for() 函数可以动态生成指向静态资源的 URL。
如图所示
示例代码
@app.route('/')
def index():
return render_template('index.html')
实现效果
5.渲染模板
在 Python 内部生成 HTML 不好玩,且相当笨拙。因为您必须自己负责 HTML 转义,以确保应用的安全。因此, Flask 自动为您配置 Jinja2 模板引擎。
模板可被用于生成任何类型的文本文件。对于 web 应用来说,主要用于生成 HTML 页面,但是也可以生成 markdown 、用于电子邮件的纯文本等等。
使用 render_template() 方法可以渲染模板,您只要提供模板 名称和需要作为参数传递给模板的变量就行了。下面是一个简单的模板渲染例子:
from flask import render_template
@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
return render_template('hello.html', name=name)
Flask 会在 templates 文件夹内寻找模板。因此,如果您的应用是一 个模块,那么模板文件夹应该在模块旁边;如果是一个包,那么就应该在包里 面:
Jinja2 模板引擎允许你在 HTML 模板中使用类似 Python 的语法来控制页面逻辑。
注意要使用 {% endif %} 来闭合if语句
作者:mist1star