flask用法详解⚡基础篇|Python 主题月

本文正在参加「Python主题月」,详情查看 活动连接html

导读

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

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

为何用flask

在这里插入图片描述

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

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

安装flask

pip install flask
复制代码

可是这样安装的话有点点慢的,仍是建议转战清华源,或者豆瓣源这些镜像正则表达式

pip install flask -i https://pypi.tuna.tsinghua.edu.cn/simple 
复制代码

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

启动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 才知道到哪去找模板、静态文件等等,另外还有:django

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

若是这里有点点不理解不要紧,最后送的书里面会给详细的解释,让你能本身动手开发项目。也能够先看一下官方文档传送门json

转换器和变量规则

要给 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若是你们想学学看的话就到个人主页找一下资源吧固然也能够私信我。最后给你们分享一下我最近特别喜欢的图片,欢迎你们三连支持哦

在这里插入图片描述

相关文章
相关标签/搜索