打开我们创建的项目
在项目目录新建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还是有保证的,加和不加都可以