1.说在前面的话
pythonweb开发框架
2.Flask开发环境搭建
关于python新建flask项目自动生成的文件夹说明:
debug=True是调试模式,当我们更改python代码,直接F5页面就能看到更改。
html文件写在templates文件夹里面,这个templates文件夹是模板的默认目录。
css文件放在static文件夹里面。当我们放问一下静态资源的时候直接在url中输入localhost:80/static/hehe.jpg即可。这是因为flask对静态文件有默认值设置的。默认情况下,flask就认为你的静态文件夹就叫static,并且位于应用程序根目录下面的。
而应用程序根目录是根据你初始化app=Flask(__name__)的时候的代码决定了哪里是根目录。如果我们要更改flask的默认设置只需要按照下图所示进行修改即可:
注意修改完后不能再通过localhost:80/static/hehe.jpg访问到了,看了源码我们知道他会截取static_folder的值的/后面的单词作为他内部注册路由的地址,所以要通过localhost:80/statics/hehe.jpg访问
当然我们也可以指定他的地址不是statics,那么我们需要传入一个static_url_path的值就修改成功了。这里不在演示
路由三种转换器:
url_for():
这个函数有很多的功能,这里我们用它来输出视图函数的url。url_for后面打的就是视图函数的名称。里面的这个.就是跟python对应程序包的一个引用,意思就是当前python包的相对路径。
设置正则路由:
获取input标签的用户名和密码:
方式一:
下面指定的username和password是和上面的form中的name是一致的,使用request.form['username']
方式二:
如果要通过url来传送数据 , https://localhost:5000/login?username=jenrey
就要用下面这种方式获取参数值,使用request.args['username']
上传文件:
redirect 是重定向函数,输入一个URL后,自动跳转到另一个URL所在的地址
注意上图windowsX用户写f.save()可能报错,需要按照下面进行修改(未测试)
应该在upload_path里面加secure_filename
写cookie:
处理错误:
返回400状态码,后面的不在处理了
但是上面这样写没有任何意义。所以我们要按照下面这么写,有个专门处理错误的装饰器@app.errorhandler(400)
我们不需要指定路由了, 只需要指定状态码,这样出现错误的时候,他就会自己响应到所对应的页面了。
flask扩展包:
方式一:
方式二:
产生依赖引用文档:
指令执行完毕会产生一个文档,他会把我们用到的包列入到文档内
requirements这个文件名其实是python约定俗成的用法,当时我们使用这个文件名,pycharm会自动帮我们识别我们装了哪些包没装哪些包
安装依赖引用文档的包:
flask-script:
Flask常用的两个包
先安装模块
pip install flask_script
flask_script 作用:可以通过命令行的形式来操作Flask,例如通过命令跑一个开发版本的服务器、设置数据库、定时任务等
或
直接把flask对象app传入进去整体代码如下
python manage.py runserver #启动服务
flask-script官网:
具体的@manager.command用法看下面
livereload:
先安装模块:
pip install livereload
用@manager.command来,上面就传入了dev的参数
模板:
禁用网页转义功能:
或者
两个效果是一样的,只不过第二个是针对值来做这个东西。|safe在就jinjia2语法中呗成为过滤器filter,这个|safe是直接禁止转义,直接把它前面的变量输出到页面。
jinjia2过滤器:
上面网站404了。http://jinja.pocoo.org/docs/2.10/templates/#list-of-builtin-filters
自定义Markdown过滤器:
@app.template_filter()装饰器:
我们只要在函数上声明这个装饰器,就可以把这个filter注册到模板
@app.context_processor上下文处理器
直接把方法注册到模板中。上下文处理器本身会返回一个字典的函数。
jinja语法:
set 赋值语句
for in循环语句及for的上下文变量loop
上面两个图拼一起才是完整的图
关于for的上下文变量loop,loop可以获得for的很多上下文信息,例如first,last,index等
上图是,在jiajn的if语句中有一种函数式表达方式叫做条件测试函数Tests,odd就是一个测试函数,将loop.index作为参数传入odd中测试一下是不是真的。http://jinja.pocoo.org/docs/2.10/templates/#list-of-builtin-tests
自定义测试函数:
@app.template_test
模板页:
语法
{% block 名称%}
{% endblock %}
上面就是模板页啦,直接运行它是没有任何效果的,是空的。
所以是没有任何意义的,那么我们可以直接继承这个模板
写模板的时候没有顺序的,只要名称对上,他会按照他的父模板来排。block的名称是唯一的。
首先我们要在我们写的html文件中引入模板,下图红框,使用extends关键字
如果我们的内容没放到块里面就会被忽略掉,所以现在看不到之前写的任何东西了。下面我们把内容放在块中:
显示效果如下图:
关于重写的问题:
增加下面代码后,发现被覆盖掉了
所以我们要这么解决,加一个supper(),这样的话在上在下都随我们自己操作。
关于block块太多的时候,可以增强代码可读性:在endblock后面可以写个名字,这样就知道end的是哪一个了。
需要注意的问题:
在block里面的变量是被封闭起来的,是不能引用block外的变量的。
如果要解决这样的问题需要在block后面加一个scoped
包含页:
当我们某些块不断去扩充的时候,可能公用的东西会很多,可能会导致我们整个的模板越来越臃肿。在这个时候我们可以采用包含页的方式,
新建一个html文件如下:
然后使用{% include '文件路径' %}
也可以如下所示跟一个数组就是包含多个文件
页面中内容的重用--宏
宏就是类似于可重用函数,只不过不是在python里面,而是在html里面。
格式{% macro %}{% endmacro %}
上面仅仅是骨架,下面补充内容
使用方式就是下面所示,跟调用函数一样的方式
如果我们定义的宏很多,就需要重新开个新的html页面,把他们都写到一起,然后import进来即可.
在新建页面中写入下图所示的代码:
导入进来(如下图):注意import的时候要写as起个别名,否则会报错的哦
下面是使用方式:同样要写别名.
消息闪现
导入flash
需要在配置文件中设置 SECRET_KEY 数值可以随意,其实就是秘钥,这样能保证数据的安全,因为我们的session是在客户端的,所以设置完SECRET_KEY后就可以通过系统自己的算法来进行验证数据安全的问题了。
这里看起来是个列表的形式,所以我们可以多次使用flash()
消息闪现的消息分类:
with和endwith是限制变量作用域的,errors只会在其之间有效果。原来我们不加with,变量的作用域是在block中的,加了之后就变成with中了。