Flask02:第一个flask程序

it2024-01-26  68

本文会给你好好介绍如何上手 Flask 。 这里假定你已经安装好了 Flask ,否则请先阅读上篇准备你的开发环境。

使用Pycharm创建一个Flask项目

项目创建完成后,目录结构如下: 这应该是一个最小的Flask应用了,让我们一起来看看生成的app.py文件:

from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run() 代码分析

首先我们导入了 Flask 类。 该类的实例将会成为我们的 WSGI 应用。

接着我们创建一个该类的实例。第一个参数是应用模块或者包的名称。如果你使用 一个单一模块(就像本例),那么应当使用__name__ ,因为名称会根据这个 模块是按应用方式使用还是作为一个模块导入而发生变化(可能是 ‘main’ , 也可能是实际导入的名称)。这个参数是必需的,这样 Flask 才能知道在哪里可以 找到模板和静态文件等东西。

然后我们使用 route() 装饰器来告诉 Flask 触发函数的 URL 。

函数名称被用于生成相关联的 URL 。函数最后返回需要在用户浏览器中显示的信息。

其中 name == 'main’是python常用的方法,表示只有直接启动本脚本时候,才用app.run方法 如果是其他脚本调用本脚本,程序假定父级脚本会启用不同的服务器,因此不用执行app.run()。 name__就是标识模块的名字的一个系统变量。这里分两种情况:假如当前模块是主模块(也就是调用其他模块的模块),那么此模块名字就是__main,通过if判断这样就可以执行“mian:”后面的主函数内容;假如此模块是被import的,则此模块名字为文件名字(不加后面的.py),通过if判断这样就会跳过“mian:”后面的内容。 我们看个示例 :

我们新建一个测试文件test.py,定义一个函数用来输出信息,然后运行该文件:

可以看到此时,test.py是作为主函数运行,此时此模块名字就是__main__.。接下来我们app.py中引入该模块使用,在文件中添加日志语句用来区分和上面的结果,方便我们看看到底在引入test.py时if __name__ == '__main__'下面的代码有没有运行:

注意,这里使用pycharm创建出来的工程默认使用的是flask run的CLI方式。这里我们重新创建一个脚本运行直接运行: 此时结果输出如下: 可以看到此时test文件中输出的就是对应的文件名称,不带文件后缀。简单来说它的作用主要就是用来区分当前模块是独立运行还是被调用。

装饰器

装饰器的概念大家应该都有所了解,在上面的代码中@app.route就是一个装饰器,其具体的内容我们先不做了解。先来看看装饰器的简单概念及使用。

python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。

在这之前我们先来聊一聊闭包的概念。一句话说就是,在函数中再嵌套一个函数,并且引用外部函数的变量。

闭包一般具有如下几个特点:

必须有一个嵌套函数(一个函数在另一个函数中)这个嵌套函数必须引用在封闭函数中定义的变量封闭函数必须返回嵌套函数

看个示例:

def outer_function(): message = '外部函数变量信息' def inner_function(): print(message) return inner_function

outer_function是外部函数;在outer_function的内部,我们定义了一个inner_function,这个函数也被称为嵌套函数,满足第一个特点。 inner_function引用了outer_function函数中的临时变量message ,满足第二个特点。

return inner_function返回了嵌套函数。满足第三个特点:封闭函数必须返回嵌套函数。

在一个外函数(outer_function)中定义了一个内函数(inner_function),内函数里引用了外函数的变量(message),并且外函数的返回值是内函数的引用。这样就构成了一个闭包。

在python中装饰器本质就是函数,作用是装饰其它函数,给其它函数增加附加功能,提高代码复用,减少代码量。 实现装饰器的条件:存在闭包现象并且被装饰的函数做装饰器函数的参数。

我们定义两个简单的装饰器:

def decorator_func(func): print("decorator1") print("decorator1:%s" % func.__name__) def wrapper(*args, **kwargs): print("decorator1 called!") return func(*args, **kwargs) return wrapper def decorator_func2(func): print("decorator2") print("decorator2:%s" % func.__name__) def wrapper(*args, **kwargs): print("decorator2 called!") return func(*args, **kwargs) return wrapper

然后使用这两个装饰器:

@app.route('/') @decorator_func @decorator_func2 def hello_world(): print("hello world called!") return 'Hello World!'

运行代码:

然后访问地址:http://127.0.0.1:5000/ 一般情况下,在函数中可以使用一个装饰器,但是有时也会有两个或两个以上的装饰器。多个装饰器装饰的顺序是从里到外(就近原则),而调用的顺序是从外到里(就远原则)。

更多的知识请大家自己去阅读相关方面的文章,毕竟我自己还没有搞得很明白,这里只是让大家知道有这么一个概念,以及知道简单的使用就好了。

URL格式

前面我们看到@app.route('/')这样的代码,其中’/'指定了Flask 触发函数的 URL,也就是我们常说的路由。

在WWW(万维网)上,每一信息资源都有统一的且在网上唯一的地址,该地址就叫URL(Uniform Resource Locator,统一资源定位器),它是WWW的统一资源定位标志,就是指网络地址。

URL由三部分组成:资源类型、存放资源的主机域名、资源文件名。 也可认为由4部分组成:协议、主机、端口、路径 URL的一般语法格式为: (带方括号[]的为可选项): potocol : // hostname[:port] / path / [;parameters][?query]#fragment

常见的protocol(协议) 协议名称描述file本地计算机上的文件。格式file:///,注意后边应是三个斜杠ftpFTP访问资源。格式 FTP://gopher通过 Gopher 协议访问该资源http通过 HTTP 访问该资源。 格式 HTTP://https通过安全的 HTTPS 访问该资源。 格式 HTTPS://mailto资源为电子邮件地址,通过 SMTP 访问。 格式 mailto:MMS通过 支持MMS(流媒体)协议的播放该资源。(代表软件:Windows Media Player)格式 MMS://ed2k通过 支持ed2k(专用下载链接)协议的P2P软件访问该资源。(代表软件:电驴) 格式 ed2k:// hostname(主机名):是指存放资源的服务器的域名系统(DNS) 主机名或 IP 地址port(端口号):整数,可选,省略时使用方案的默认端口,各种传输协议都有默认的端口号,如http的默认端口为80。如果输入时省略,则使用默认端口号。path(路径):由零或多个“/”符号隔开的字符串,一般用来表示主机上的一个目录或文件地址。parameters(参数):这是用于指定特殊参数的可选项。query(查询):可选,用于给动态网页(如使用CGI、ISAPI、PHP/JSP/ASP/ASP.NET等技术制作的网页)传递参数,可有多个参数,用“&”符号隔开,每个参数的名和值用“=”符号隔开。fragment(信息片断):字符串,用于指定网络资源中的片断。例如一个网页中有多个名词解释,可使用fragment直接定位到某一名词解释。也可以理解为锚点。 Flask程序运行

自 Flask 0.11 开始有多种内建方法可以运行开发服务器。最好的方法是使用 flask 命令行工具。

使用pycharm创建好flask工程后,可以看到其已经为我们配置好了启动运行参数,打开项目配置: 直接运行:

在这种环境下,使用以前的教程,比如在if name == ‘main’:下面的代码是不会被执行的:

此时我们如果需要修改一些配置参数,比如打开debug调试,应该调整配置项的配置: 此时运行debug模式已经处于开启状态:

大家可以注意到此时服务器默认监听的是本地127.0.0.1的5000端口,运行服务器后,会发现只有你自己的电脑可以使用服务,而网络中的其他电脑却 不行。缺省设置就是这样的,因为在调试模式下该应用的用户可以执行你电脑中 的任意 Python 代码。

如果需要修改任意机器可以访问,可以添加–host=0.0.0.0参数:

同理如果想要修改端口号,添加port参数:

如果有人说,我还是喜欢旧版的使用方式,直接在代码中修改相关的配,那么我们同样可以自定义配置项,删除pycharm为我们创建好的配置,新建:

运行程序: 此时修改配置:

调试

点击下图按钮开启调试:

这里我们简单模拟下异常情况,访问http://127.0.0.1:5000/ 此时页面会打印出现异常的信息,更多的错误信息可以参考:https://werkzeug.palletsprojects.com/en/1.0.x/debug/#using-the-debugger

最新回复(0)