Flask入门——简单应用

打开我们创建的项目

在项目目录新建python源文件 叫做run或者项目的名字

我们需要导入flask包给我们提供的核心的类

我们发现没有找到,因为我们的flask安装在虚拟环境里的但是在默认情况下pycharm他所指代的默认环境不是虚拟环境

而是我们全局的python环境

在External Libraries看到

我们需要设置当前项目的虚拟环境路径

点击File,然后settings

打开后左边选择Project:fisher

Project Interpreter

选择之后可以看到我们当前项目所指向的python环境不是我们的虚拟环境

pycharm下面看到选择的环境所有的包

点击小箭头

为了确定虚拟环境的路径

我们进入cmd

需要确保启动pipenv shell

pipenv --venv看到目录

然后选中后apply然后ok这个时候看到已经可以找到Flask包


首先需要实例化Flask

app = Flask()

我们发现错误提示Flask实例化少了一个参数,这个参数作为我们Flaskapp作为对象的核心标识

可以输入任意字符串,不过可以使用python内置变量__name__

我们调用run方法

app.run()

这样就初步完成Web服务器启动可以运行一下

python fisher.py看到类似信息就启动了



我们如果需要写业务逻辑需要定义一些列识图函数

def hello():
    return 'Hello,Gannicus'

普通程序使用hello()访问函数

但是在web应用使用浏览器访问函数

更加准确地说是通过http请求来访问函数


需要路由


我们需要在函数上加装饰器

@app.route('/hello')
def hello():
    return 'Hello,Gannicus'

http://127.0.0.1:5000/hello访问

我们已经完成最简单的FlaskWeb应用原型

Flask就是这么简单什么都不需要只需要单文件几行代码,就可以启动Web服务器


Flask的controller在哪?hello函数就是controller

只不过在flask不把他叫控制器叫识图函数

就是controller

所谓视图函数本质来说就是函数,只不过是用来控制view识图的所以flask称作识图函数

除了视图函数控制写法,还提供了基于类的识图(即插识图)


基于类的识图:比较好的编码方式是面向对象,就是一个个的类,基于函数的识图很难实现代码复用,因为我们的类可以继承

可以把一些相同代码写到基类里去,函数是无法继承的


假如用户不小心在hello后面/


然后就notfound 就没有访问到

这个问题怎么解决?我们如何兼容用户的这种行为

@app.route('/hello/')
def hello():
    return 'Hello,Gannicus'

这样就可以兼容了


flask兼容带不带/的基本原理:

flask在处理两种url路径的时候,实质是做了重定向


正常访问流程中,浏览器访问url1所指向的资源我们服务器在接收到之后就把url1指向的资源或者说页面返回到我们的浏览器,状态设置成200


重定向:浏览器访问url1地址,服务器接收到这次请求之后,出于某种原因,比如说可能没有url1对应的页面,也有可能是不想让你访问url1所对应的页面,这时候会在返回的response的header也就是头里面增加一个标志位location并且给这个location一个值url2,同时把返回的状态码更改成301或者302

当浏览器接收到返回后,看状态码,这个状态码如果是301或者302就知道我们服务器要做重定向,然后就会再一次发送请求,这次请求地址就是url2



Flask是把不带/的url重定向到带/的url


为什么flask要这么做?

从逻辑上来讲这样做不合理,因为flask知道真正访问的视图函数是带/,为什么不让你第一次发送不带/的时候就直接进入到所定义的视图函数里面来而要做一次重定向呢


唯一url原理:如果说不做重定向,不带/可以访问,带/也可以访问,实质上来讲同一个识图函数,或者说要访问的资源对应2个不同的路由,他没有保证唯一url原则


保证唯一url:如果你是两个url当你的网站被搜素引擎索引,两个网站是会被索引两次的,但是实际上来说两个url都是同样的hello,gannicus没有这个必要

这个涉及到SEO,就是搜索引擎的优化


一般不加/,也可以保证唯一url,但是缺点在于不兼容用户多输入的情况

但是唯一url还是有保证的,加和不加都可以

猜你喜欢

转载自blog.csdn.net/jhkj_5154/article/details/80331453