Flask学习笔记

这类python框架都很简单,熟悉mvc的很快就能上手。

安装:pip install Flask

第一个Flask应用:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run(debug=True)

这就是全部了,一个应用名字app,@app.route('/')这个就是路由表。

表单的提交:

@app.route('/submit', methods=['POST'])
def submit():
    username = request.form.get('username')
    return f'Hello, {username}!'

第三部模版和参数传递:

from flask import render_template

@app.route('/hello/<name>')
def hello(name):
    return render_template('test.html', name=name)

很多都不需要花时间来看,都是python的语法和调用,我们只需专注于我们返回的视图功能,

这里视图就是路由的函数。

这里还需要注意的时模版:

{{ name }} 是模板占位符,将在渲染时被替换成实际的值

{% extends "base.html" %}:继承基础模板。

{% block title %} 和 {% block content %}:重写基础模板中的块内容。

条件语句:

{% if user %}
    <p>Welcome, {{ user }}!</p>
{% else %}
    <p>Please log in.</p>
{% endif %}

循环:

<ul>
{% for item in items %}
    <li>{{ item }}</li>
{% endfor %}
</ul>

过滤:

{{ name|capitalize }}:将 name 变量的值首字母大写。

{{ price|round(2) }}:将 price 变量的值四舍五入到小数点后两位。

这类应用最常见的功能就是后台管理程序,主要就是数据的获取和展示。

这类应用的部署也是非常的简单:

1、安装服务器pip install gunicorn

2、配置nginx:

server {
    listen 80; #这个是nginx打开的端口
    server_name yourdomain.com;

    location / {
        proxy_pass http://127.0.0.1:8000; #这个是gunicorn的端口
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

3.启动gunicorn

gunicorn -w 4 -b 0.0.0.0:8000 app:app
-w 4:启动 4 个工作进程。
-b 0.0.0.0:8000:绑定到所有网络接口上的 8000 端口。
app:app:指定 Flask 应用实例的位置,格式为 模块名:实例名。

4、运行nginx

5、在浏览器http://127.0.0.1:80访问。

<think>好的,我现在需要解决用户在Numba的`@njit`装饰器中使用全局列表进行`append`操作时出现的错误。首先,我得回顾一下Numba的工作原理和它对全局变量的处理。 根据引用[3],Numba的JIT装饰器(如`@njit`)会将函数编译成机器码以提高执行速度,但编译过程中对Python的动态特性支持有限。全局变量在编译时可能被固定为常数值,导致运行时修改无效或出错。用户的问题是在`@njit`函数中使用了全局列表的`append`方法,这可能会引发错误,因为Numba无法正确处理可变全局变量。 接下来,我需要分析错误的具体原因。Numba要求JIT函数内的变量类型必须是确定的,而全局列表的类型和结构可能在编译时无法推断,导致无法正确编译。此外,修改全局变量在并行环境中可能导致线程安全问题,Numba可能因此禁止此类操作。 解决方案方面,可能的途径有几种。首先,可以将全局列表作为参数传递给JIT函数,并在函数内部修改后返回,这样避免直接依赖全局变量。例如,用户可以在调用函数时传入列表,函数处理后再返回修改后的列表。这种方法符合Numba对参数和返回值类型确定性的要求。 另一个方法是使用Numba的`typed.List`,这是Numba提供的专门支持的类型,可以在JIT函数中使用。用户需要将普通的Python列表转换为`numba.typed.List`类型,这样Numba就能正确识别并处理列表操作。例如,在函数外部创建`typed.List`实例,并在装饰的函数中使用它进行`append`操作。 另外,引用[1]中提到,Codon的JIT允许通过参数传递全局变量,可能类似的思路适用于Numba,即显式传递所需变量而非隐式依赖全局作用域。用户需要调整代码结构,减少对全局状态的依赖,这也有助于代码的可维护性。 还需要考虑是否用户使用的Numba版本支持某些特性。较新的版本可能对全局变量的处理有所改进,但通常仍建议避免在JIT函数中修改全局变量。检查Numba的文档和更新日志可以确认这一点,但用户可能更倾向于代码调整而非升级库。 最后,如果上述方法都无法解决问题,可能需要将涉及全局列表的部分移出JIT函数,用普通Python函数处理,而只对计算密集的部分使用JIT加速。或者,将列表操作封装在支持的结构中,如使用闭包或类来管理状态,但这可能增加代码复杂度。 总结可能的解决步骤:1. 将列表作为参数传递;2. 使用`numba.typed.List`;3. 避免在JIT函数中修改全局变量。需要测试这些方法,并查看错误是否解决。同时,参考引用[3]中的示例,确保代码结构符合Numba的要求,比如类型明确和避免动态Python特性。</think>### 解决方案 在Numba的`@njit`装饰器中使用全局列表时,需特别注意Numba对动态Python特性的限制。以下是具体解决方案: #### 1. **避免直接修改全局列表** Numba在编译时会将全局变量视为常量,直接修改可能导致类型推断错误或未定义行为。 **解决方法**:将列表作为参数传入函数,并在函数内操作后返回修改后的列表。 ```python from numba import njit my_list = [1, 2, 3] @njit def process_list(lst): lst.append(4) # 操作传入的列表 return lst result = process_list(my_list.copy()) # 传入副本以避免修改原列表 print(result) # 输出 [1, 2, 3, 4] ``` #### 2. **使用Numba的`typed.List`类型** Numba支持`numba.typed.List`类型,它能明确类型信息以支持JIT编译。 **步骤**: - 将普通Python列表转换为`numba.typed.List`。 - 在`@njit`函数中使用该列表。 ```python from numba import njit, typed # 创建Numba兼容的列表 my_list = typed.List([1, 2, 3]) @njit def append_element(): my_list.append(4) # 操作全局的typed.List append_element() print(my_list) # 输出 [1, 2, 3, 4] ``` #### 3. **将全局变量封装在函数作用域内** 通过闭包或类封装全局变量,避免直接依赖全局作用域。 ```python from numba import njit def create_processor(): local_list = [1, 2, 3] # 封装在闭包作用域内 @njit def process(): # 仍需要确保local_list类型兼容 # 此处需结合typed.List或其他方法 pass return process ``` #### 4. **降级为`@jit(nopython=False)`模式(不推荐)** 临时使用Numba的`object`模式,但会牺牲性能。 ```python from numba import jit my_list = [1, 2, 3] @jit(nopython=False) # 启用兼容模式 def append_element(): my_list.append(4) append_element() print(my_list) # 输出 [1, 2, 3, 4] ``` --- ### 错误原因分析 Numba的`@njit`要求函数内**所有变量类型在编译时确定**,而全局列表的修改可能引发以下问题: 1. **类型不稳定性**:列表元素类型可能动态变化,导致编译失败[^3]。 2. **线程安全问题**:全局变量在并行环境中可能引发竞态条件[^2]。 3. **作用域隔离**:JIT函数在编译时会固定全局变量的值,后续修改无效[^1]。 --- ### 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值