手把手教你做项目web框架flask篇——基础用法详解

Posted 肥学大师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手把手教你做项目web框架flask篇——基础用法详解相关的知识,希望对你有一定的参考价值。

导读

今天接着为暑假的项目做准备,最近一直做python类的总结所以我们的项目就从python开始吧,喜欢java的同学也不要气馁,后面也会相应的写一个java类的项目喜欢的同学可以关注一波,暑假跟着敲一敲,也可以先收藏一波等有空的时候拿来练手,好了我们进入正题,喊出口号“不肥身体,肥学问

强调:文章中的内容有不理解或者有毛病的可以留言哦,另外说一下我这只是一篇基础的介绍建议大家还是看看我文章末尾发的资源可以详细了解一下。

为什么用flask

在这里插入图片描述

FLask框架本身只实现了最基本的功能,所以FLask被称为 microFramework(微框架),从代码量上来看,的确如此。但是从工程上来看,这种所谓的“小”,反而带来了更多的便利性。在大型项目里,flaskdjango方便太多。大型的意思是你要自定义admin系统(比如管理员分层,每个管理员都能自定义管理组),复杂的数据库操作,许多许多的跨entity的表单操作及验证等。

丰富的第三方库资源,让你在编写几乎任何类型的程序时都能如鱼得水。操作数据库用FLask-SQLAlchemy,验证表单用Flask-WTF,登录管理用FLask-Login,邮件用Flask-Mail... 所以,Flask和兄弟框架Django比起来,另一个有点就很明显了:灵活。你可以任意选择喜欢的第三方扩展

安装flask

pip install flask

但是这样安装的话有点点慢的,还是建议转战清华源,或者豆瓣源这些镜像

pip install flask -i https://pypi.tuna.tsinghua.edu.cn/simple 

另外还需要提一点的是我们最好在写项目的时候建工程使用虚拟环境这样可以预防一些python包的冲突,另外对于不怎么会建立虚拟环境的同学我会在下面推荐一本书,里面会有详细的教程。

启动flask

from flask import Flask

app=Flask(__name__)#创建一个实例这样 下面有专门讲这个的

@app.route('/') #.route的作用时从实例这里创建路由告诉 Flask 什么样的URL 能触发我们的函数
def hello(): #简单的创建一个函数
    return '你好'

if __name__=='__main__':
    app.run(debug=True)# .run是flask开始运行的语句,里面也有很多参数一般建议使用debug=True,自带的调试总比你自己要好一点
    app.run(host='192.168.1.2',port=3308)# 可加可不加这是对具体host和端口的设置,取决你的默认端口是否被占用

详情看调试器操作:传送门
在这里插入图片描述

flask里name的用处

从上面的程序里面我们可以看出flask里面有个name这个是为了启动模板专门设立的如果你使用单一的模块(如上例),你应该使用 name ,因为模块的名称将会因其作为单独应用启动还是作为模块导入而有不同( 也即是 ‘main’ 或实际的导入名)。这是必须的,这样 Flask 才知道到哪去找模板、静态文件等等,另外还有:

static_folder:静态地址,默认为static文件夹
static_url_path:静态网页地址
template_folder:模板文件夹,默认为templates文件夹

如果这里有点点不理解没关系,最后送的书里面会给详细的解释,让你能自己动手开发项目。也可以先看一下官方文档传送门

转换器和变量规则

要给 URL 添加变量部分,你可以把这些特殊的字段标记为 <variable_name> , 这个部分将会作为命名参数传递到你的函数。规则可以用 <converter:variable_name> 指定一个可选的转换器,转换器主要是将页面后的值作为某一个标准来得到另一个页面,我们常看到的加密字符串就是用这个做

from flask import Flask
 
app = Flask(__name__)
 
 
@app.route('/user/<username>')#定义转换器
def show_user_profile(username):#将转换器传入函数中
    # show the user profile for that user
    return 'User %s' % username
 
 
@app.route('/post/<int:post_id>')
def show_post(post_id):
    # show the post with the given id, the id is an integer
    return 'Post %d' % post_id
 
 
if __name__ == '__main__':
    app.run()


Flask的默认转换器:DEFAULT_CONVERTERS = {
‘default’: UnicodeConverter,
‘string’: UnicodeConverter,any: AnyConverter,
‘path’: PathConverter,int: IntegerConverter,float: FloatConverter,
‘uuid’: UUIDConverter,}

下面展示自己定义转换器的方法

class rc(BaseConverter):      
 # 重写父类的属性,定义转换器规则
    def __init__(self,url_map):
        super(rc,self).__init__(url_map)
        #验证QQ邮箱的正则表达式
        self.regex ='[0-9a-zA-Z_]{0,19}@qq.com'
    #定义视图函数下的返回值
    def to_python(self,value):
        val=value
        return val
    def to_url(self,value):#返回url
        return value
app.url_map.converters['em'] = rc #将自定义的转换器添加到转换器列表中
@app.route('/emm/<em:email>') #加入新的转换器
def email(email):
    return 'email is:%s' % email #返回email

重定向

重定向在web开发也挺重要的,它可以从一个网页跳到另一个网页,相当于刷新之后的操作,对flask而言主要涉及两个模块(redirect,url_for)
先建立一个路由用作后面讲例子

@app.route('/1')
def fg():
    return '1122'

from flask import redirect,url_for
@app.route('/refer')
def refer():
    return redirect('/1')#创建的另外一个路由

这样就可以直接跳转到路由(‘/1’)中的函数中并显示返回值。
我们可以先访问路由函数,然后跳转到相应内容页面这种方式称为间接跳转

@app.route('/ref')
def ref():
    return redirect(url_for('fg')) #跳转这样直接访问ref子页面就可以直接跳转到相应页面了

设置错误页面

大家都知道网页加载避免不了404 等一些错误的,flask有两种方式,一是使用系统的abort直接赋值,二是使用自定义errorhandler函数

  • 使用abort()你可以用 redirect() 函数把用户重定向到其它地方。放弃请求并返回错误代码,用 abort() 函数。这里是一个它们如何使用的例子:
from flask import abort, redirect, url_for
 
@app.route('/')
def index():
    return redirect(url_for('login'))
 
@app.route('/login')
def login():
    abort(401)#401 意味着禁止访问
    this_is_never_executed()
  • 默认情况下,错误代码会显示一个黑白的错误页面。如果你要定制错误页面, 可以使用 errorhandler() 装饰器:
from flask import render_template
 
@app.errorhandler(404)
def page_not_found(error):
    return render_template('page_not_found.html'), 404

注意 render_template() 调用之后的 404 。这告诉 Flask,该页的错误代码是 404 ,即没有找到。默认为 200,也就是一切正常。

json数据读取

json作为通用的数据传输格式其实用性还是比较高的,flask作为web框架对它当然也有一定的处理能力,目前是使用jsonify


@app.route('/json1')
def json1():
    data={'name':'HW','first':'ZJ'}
    return jsonify(data)


@app.route('/json2')
def json2():
    return jsonify(hour=12,second=21)

在这里插入图片描述

cookie和session

session里面保留的就是会话内容,它存在于cookie当中,通过它我们可以直接登陆某些已经登陆过的系统。要想操作session我们需要引入为它专门准备的session模块,还有需要配置安全秘钥才可以使用session
先来说一下cookie的操作


cookie的设置
set_cookie(key, value='', max_age=None, expires=None,path='/', domain=None, secure=False, httponly=False,samesite=None)

key:键
value:值
max_age:设置过期时间(秒)
expires:设置过期时间,时间戳的形式(1970离现在的时间)
path:当前主域名
domain:子域名
#设置cookie和headers
@app.route('/set_cookie')
def set_cookie():
    response=make_response('cookie设置成功')
    #cookie有效时长30天也可以是hour second minute
    time=datetime.datetime.today()+datetime.timedelta(days=30)#设置cookie的有效时长
    response.set_cookie('user','admin',expires=time) #设置用户名的cookie
    response.set_cookie('pass','123456',expires=time) #设置密码的cookie
    response.headers['X-Something']='mything' #这里不允许出现中文
    response.headers['Server']='feixue' #服务器名称
    return response

在这里插入图片描述

对cookie的获取和删除

获取cookie需要加request模块可不是爬虫的requests


@app.route('/get_cookie')
def get_cookie():
    name="用户名:"+request.cookies.get('user')+"密码:"+request.cookies.get('pass')
    return name

在这里插入图片描述
删除cookie有两种方式
1·通过设置通过设置cookie过期时间为0即可删除


@app.route('/del_cookie1')
def del_cookie1():
    response=make_response('delete cookie 1')
    response.set_cookie('user','',expires=0)
    response.set_cookie('pass','',expires=0)
    return response

2.直接删除cookie

@app.route('/del_cookie2')
def del_cookie2():
    response=make_response('delete cookie 2')
    response.delete_cookie('user')
    response.delete_cookie('pass')
    return response

使用基于 cookie 的会话需注意: Flask 会将你放进会话对象的值序列化至 Cookies。如果你发现某些值在请求之间并没有持久存在,然而确实已经启用了 Cookies,但也没有得到明确的错误信息。这时,请检查你的页面响应中的 Cookies 的大小,并与 Web 浏览器所支持的大小对比。

session操作

设置session
配置安全密钥
随机的问题在于很难判断什么是真随机。一个密钥应该足够随机。你的操作系统可以基于一个密钥随机生成器来生成漂亮的随机值,这个值可以用来做密钥:


app.config['SECRET_KEY']=os.urandom(30)

设置session字典


session['user']='fei'
session['pass']='xue'

设置session过期方式


session.parmanent=True #默认31天后过期
#session两个小时过期
app.config['PERMANENT_SESSION_LIFETIME']= timedelta(hour=2)

合起来就是

@app.route('/session1')
def session1():
    session['user']='fei'
    session['pass']='xue'
    session.parmanent=True #默认31天后过期
    return 'login success'

获取session
get()获取和索引获取,索引获取不太稳定还是建议用get方法


@app.route('/session')
def session2():
    us=session.get("user")
    pa=session.get("pass")
    return 'hello %s %s'%(us,pa)

删除session
逐一删除


@app.route('/session')
def session3():
    session.pop('user',None)
    session.pop('pass',None)
    return 'delete successful!'

全删


@app.route('/session4')
def session4():
    session.clear()
    return 'delete successful!'

request的使用

在上面获取cookie有提到request,下面我们来特意讲一下关于request的使用这是一个专门用来操作网页请求的模块。
requestget请求

可通过设置它的methods参数来指定请求方式。

@app.route('/get', methods = ['GET','POST'])
def get():
    if request.method == 'GET':
        return '这是一个GET请求'
    else:
        return '这是一个其它请求'

post请求

@app.route('/post', methods = ['POST','GET'])
def post():
    if request.method == 'POST':
        return '这是一个POST请求'
    else:
        return '这是一个其它请求'

request的args

记录get请求中的查询参数,一般用于查询,搜索网址

https://www.kugou.com/yy/html/search.html#searchType=song&searchKeyWord=你的名字
它会返回get请求中的参数,比如请求上面的url,它的请求参数便是:

searchType=song&searchKeyWord=你的名字
使用方法:

request.args['keyword']
request.args.get('keyword')

requestform
记录请求中的表单数据,一般用于表单提交。比如我们注册网站时经常需要进行表单提交。

我们可以使用获取表单中的内容:

request.form['keyword']
request.form.get('keyword')

requestheaders

返回请求网页头部信息,返回一个列表。

request.headers['keyword']
request.headers.get('keyword')

蓝图开发必备

这个知识一看就会
下面这个程序的存放文件叫fei.py

from flask import Flask
app=Flask(__name__)
@app.route('/kj')
def df():
    return 'hello world'
@app.route('/index')
def lk():
    return 'efhsfj'

于是就有

from flask import Flask,request
from fei import *
@app.route('/')
def login():
    return request.url
if __name__ == '__main__':
    app.run(debug=True)

看出来了吧,就是从主文件调用此文件里面的功能蓝图的精髓无非就是将多个模块引入到一个主模块中使用,相当于我们自己在写模块并把它当到蓝图中供调用。多个蓝图中如果有相同方法可用蓝图视图函数来区分各自的方法。

视图

视图可大家理解的视图意思差不多,比如mysql数据库中的视图,道理其实都是互通的,并不会有太大的差别,只是功能不一样罢了。创建视图的方式也很简单,都继承自flask的views类。
类的视图

from flask.views import View
def ff():
    return 'ok'
class st(View):
    def dispatch_request(self): #必须实现这个方法
        return "任性的90后boy"
# 类视图通过add_url_rule方法和url做映射
app.add_url_rule(rule='/ff',view_func=st.as_view('tt'))

方法的

from flask.views import MethodView
def gg():
    return 'ok'
class login(MethodView):
    #当客户端通过get方法进行访问的时候执行的函数
    def get(self):
        return 'get'
    # 当客户端通过post方法进行访问的时候执行的函数
    def post(self):
        email = request.form.get("user")
        password = request.form.get("pass")
        if user== 'gffsadff' and pass== '4fsaferwf':
            return "登录成功"
        else:
            return "登陆失败"

# 通过add_url_rule添加类视图和url的映射,并且在as_view方法中指定该url的名称,方便url_for函数调用
app.add_url_rule('/gg',view_func=login.as_view('lg'))

资源分享

跟上次MySQL篇一样为了让大家可以更好的学习,也给大家找了一些资源flask web开发基于python如果大家想学学看的话就到我的主页找一下资源吧当然也可以私信我。最后给大家分享一下我最近特别喜欢的图片,欢迎大家三连支持哦

在这里插入图片描述

链接:手把手教你做项目系列欢迎订阅

以上是关于手把手教你做项目web框架flask篇——基础用法详解的主要内容,如果未能解决你的问题,请参考以下文章

手把手教你做项目MySQL篇——从下载到命令总结

手把手教你快速吃透Flask web开发!仅分享3天!

《手把手教你》系列基础篇(七十三)-java+ selenium自动化测试-框架设计基础-TestNG实现启动不同浏览器(详解教程)

手把手教你用Python做web疫苗登记系统

《手把手教你》系列基础篇(七十二)-java+ selenium自动化测试-框架设计基础-TestNG简单介绍(详解教程)

CSDN博客太火了也教你做一个——(期末web大作业)