flask基础-请求响应(current_app,redirect,abort,ip 拦截,获取IP,url_map)

本文介绍了Flask框架中的基本请求响应处理,包括使用`render_template`加载并渲染模板文件到浏览器,以及`render_template_string`将HTML字符串直接渲染。同时,还提到了HTML注释、模板注释以及空白处理对带宽的影响。

- render_template找到模板文件,渲染到浏览器中

- render_template_string 他是直接把html的字符串渲染过去(简单的说,就是代码本身)

- 看到的html网页源代码就是这个

 

- docs.jinkan.org/docs/jinja2/extensions.html

- HTML注释,通过查看源代码可以看到,模板注释,查看源代码看不到

- 空白,传输的时候会占带宽 

# 1.从flask包/模块 中引入flask类
from flask import Flask,current_app,g,request,session,make_response
from flask import render_template,redirect,abort

app = Flask(__name__)
app.debug = True

# current_app当前应用的实例
# g 处理请求时的临时存储对象,每次请求都会重设这个变量
@app.route('/index')
def index():
    print('app:',app)
    print('current_app',current_app) # current_app当前应用的实例
    print(app == current_app) # True 只是值相等,因为我们目前只有一个app启动,没有多个
    print(app is current_app) # False  引用是不一样的
    return 'index'

@app.route('/')
def helloworld():
    # 视图函数
    # return 'hello world,susede'
    # 访问'/'时,重定向到'/test'页面
    # return redirect('/test')
    # abort(403) # 触发一个异常,不需要return,会调用后续的forbidden函数
    # ip 拦截
    ip_list = ['127.0.0.2']
    ip = request.remote_addr
    if ip in ip_list:
        abort(403)  #  会调用后续的forbidden函数
    return 'hello,sucess,welcome'

# 路由配置使用装饰器 @app.route(url,methods)
@app.route('/test')
def hellotest():
    # 视图函数
    return 'hello world,test0222,测试函数'

# URL获取视图中的参数page
@app.route('/user/')
@app.route('/user/<page>')
def list_user(page=1):
    return '你好,我是第{}页用户'.format(page)

# 使用API配置 app.add_url_rule(url,url_name,view_name)
app.add_url_rule('/test-apimethod','apimethod',hellotest)

# 查看url路由规则
print(app.url_map)


@app.route('/test/req')
def test_request():
    '''请求报文练习'''
    get_args = request.args
    print('get_args',get_args)# get请求参数获取
    print(get_args.get('page',1)) # 请求中没有传入page值,那么可以设置默认值
    print(request.args.get('name'))
    # 获取服务器所在的主机IP地址
    headers = request.headers
    print(headers)
    print('host',headers.get('host'))

    # 获取请求用户的ip地址
    user_ip = request.remote_addr
    print('user_ip',user_ip)
    print(request.remote_user)

    # 获取user-agent,可以用于爬虫
    user_agent = request.headers.get('user-agent',None)
    print('User-Agent:','\n',user_agent)
    return 'request success'

@app.before_first_request
def first_request():
    """服务器启动后第一个请求到达前"""
    print('服务器启动后第一个请求到达前,first_request')

@app.before_request
def per_request():
    """每一个请求到达前"""
    print('每一个请求到达前,per_request')

# @app.after_request
# def after_request(reponse):
#     """请求结束后执行,过程中产生异常则不执行"""
#     print('请求结束后执行,过程中产生异常则不执行,after_request')
#     print(reponse.get_json())
#     return 'after_request'

@app.route('/test/resp')
def test_response():
    """测试响应"""
    return '响应测试,reponse success',405,{
        'user_name':'mark','user_id':'mark_id2'}

@app.route('/test/mkresp')
def test_mkresponse():
    '''使用make_response构造响应对象'''
    mkresp = make_response('这是一个响应对象',403,{
        'token':'abc123'
    })
    mkresp.headers['user_name'] = 'nick_li'
    mkresp.status_code = 200
    return mkresp

@app.route('/test/htmlresp')
def test_html_response():
    '''响应html'''
    html = '<html><body><h1 style="color:red">这是一个HTML响应测试</h1></body></html>'
    resp = make_response(html)
    return resp

@app.route('/test/html')
def test_html():
    '''从文件读取html'''
    html = render_template('test1.html')
    resp = make_response(html,400) # 都可以参考前面的使用
    return resp

@app.errorhandler(403)
def forbidden_page(err):
    """403错误提示:你没有权限访问页面"""
    print(err)
    return '你没有权限访问页面,请联系管理员开通权限'

# if __name__ == '__main__':
#     app.run()

 

 

<think> 根据用户要求,我需要解析一段Flask代码的含义和功能。用户提供的代码是: ```python from flask import Flask app = Flask(__name__) @app.route('/') def home(): return "Hello, World! This is my first Flask app." if __name__ == '__main__': app.run(debug=True) ``` 我将按照用户的要求,使用中文回答,并确保回答结构清晰、真实可靠。同时,我会参考站内引用中提供的相关信息。 ### 步骤解析 1. **导入Flask模块**: - `from flask import Flask`:这行代码从Flask库中导入Flask类。Flask类是一个WSGI应用程序,它是构建任何Flask应用的基础[^4]。 2. **创建Flask应用实例**: - `app = Flask(__name__)`:这里创建了一个Flask应用实例。参数`__name__`表示当前模块的名称,Flask使用它来确定应用程序的根目录,以便查找资源文件(如模板和静态文件)[^4][^1][^2][^3]。这是初始化Flask应用的必需步骤。 3. **定义路由和视图函数**: - `@app.route('/')`:这是一个装饰器,它将URL路径`'/'`(即根路径)绑定到下面的视图函数。当用户访问网站的根URL(如`http://localhost:5000/`)时,Flask会调用这个视图函数[^3][^1]。 - `def home(): ...`:这是视图函数的定义。它返回一个字符串`"Hello, World! This is my first Flask app."`。当用户访问根路径时,浏览器将显示这个字符串[^1][^3]。 4. **启动开发服务器**: - `if __name__ == '__main__':`:这个条件确保下面的代码只在脚本被直接运行时执行(而不是作为模块导入时)[^1][^2][^3]。 - `app.run(debug=True)`:启动Flask开发服务器。参数`debug=True`启用调试模式,这意味着: - 服务器会在代码更改时自动重新加载(便于开发)。 - 如果发生错误,浏览器会显示详细的错误信息(包括堆栈跟踪)[^1][^2]。 ### 整体功能 这段代码创建了一个简单的Flask Web应用程序: - 当用户访问根URL(`/`)时,它会返回一条欢迎消息。 - 服务器运行在本地(默认地址为`127.0.0.1:5000`),并启用了调试模式,便于开发和测试。 ### 参考说明 - 创建Flask实例时使用`__name__`是标准做法,如引用[4]所述。 - 路由装饰器(`@app.route`)的用法与引用[1][2][3]中的示例一致。 - 使用`app.run()`启动服务器并设置`debug=True`是常见的开发配置,如引用[1][2]所示。 §§相关问题§§ 1. Flask中`__name__`参数的具体作用是什么? 2. 如何为Flask应用添加多个路由? 3. Flask的调试模式有哪些潜在风险? </think>下面我将逐步解析您提供的Flask代码含义和功能: ```python from flask import Flask app = Flask(__name__) @app.route('/') def home(): return "Hello, World! This is my first Flask app." if __name__ == '__main__': app.run(debug=True) ``` ### 1. 导入Flask模块 - `from flask import Flask`:从Flask框架导入核心的Flask类,这是创建Web应用的基础[^4] - 必须首先导入才能使用Flask的所有功能 ### 2. 创建应用实例 - `app = Flask(__name__)`:创建Flask应用实例 - `__name__`参数表示当前模块名: - 帮助Flask定位资源文件(模板、静态文件) -Flask应用的初始化标准写法[^4][^1] - 这个实例`app`将成为整个应用的核心对象 ### 3. 定义路由和视图函数 - `@app.route('/')`:路由装饰器 -URL路径`/`(网站根目录)映射到下方函数 - 当用户访问`http://localhost:5000/`时会触发此函数[^1][^3] - `def home():`:视图函数定义 - 函数名`home`可以是任意有效标识符 - 当路由被访问时自动调用此函数 - `return "Hello, World! ..."`:响应内容 - 直接返回字符串作为HTTP响应- 浏览器将显示此文本内容[^1][^3] ### 4. 启动开发服务器 - `if __name__ == '__main__':`:Python惯用写法 - 确保代码只在直接运行此脚本时执行(非导入时) - `app.run(debug=True)`:启动Flask开发服务器 - 默认运行在`127.0.0.1:5000` - `debug=True`启用调试模式: - 自动重载:修改代码后服务器自动重启[^1][^2] - 详细错误页面:出错时显示完整堆栈跟踪 - 调试器:支持网页交互式调试 ### 整体功能 这是一个最小化的Flask Web应用: 1. 访问根URL `/` 时返回欢迎文本 2. 启用调试模式的开发服务器 3. 完整的请求处理流程:路由→视图→响应
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值