突破%

 

python后端框架之Flask

Flask

一、环境搭建与项目创建

1、安装
pip install flask

2、项目创建
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run()

3、运行项目
python hello.py  
app.run()

二、Flask基础知识

1、Flask 路由
from flask import Flask
app = Flask(__name__)
 
如果访问/,浏览器返回“Index Page”
@app.route('/')
def index():
    return 'Index Page'
 
如果访问/hello,浏览器返回“Hello,World”
@app.route('/hello')
def hello():
    return 'Hello, World'
if __name__ ="__main__":
    app.run()

2、变量规则
@app.route('/user/<username>')
def show_user_profile(username):
    #显示用户名
    return 'User {}'.format(username)
 
@app.route('/post/<int:post_id>')
def show_post(post_id):
    #显示提交整型的用户"id"的结果,注意"int"是将输入的字符串形式转换为整型数据
    return 'Post {}'.format(post_id)
 
@app.route('/path/<path:subpath>')
def show_subpath(subpath):
    #显示 /path/ 之后的路径名
    return 'Subpath {}'.format(subpath)

3、唯一的URL /重定向行为
Flask的URL规则基于Werkzeug的路由模块。这确保形成的URL是唯一的,并且基于Apache规定的先例。
from flask import Flask
app = Flask(__name__)
 
@app.route('/python')
def hello_flask():
   return 'Hello Flask'
或者
@app.route('/python/')
def hello_python():
   return 'Hello Python'
 
if __name__ == '__main__':
   app.run()

4、Flask URL构建
 
 
from flask import Flask, redirect, url_for
app = Flask(__name__)
 
@app.route('/admin')
def hello_admin():
   return 'Hello Admin'
 
@app.route('/guest/<guest>')
def hello_guest(guest):
   return 'Hello {} as Guest'.format(guest)
 
@app.route('/user/<name>')
def hello_user(name):
   if name =='admin':
      return redirect(url_for('hello_admin'))
   else:
      return redirect(url_for('hello_guest',guest = name))
 
if __name__ == '__main__':
   app.run(debug = True)

5、Flask HTTP方法
from flask import Flask, redirect, url_for, request
app = Flask(__name__)
 
@app.route('/success/<name>')
def success(name):
   return 'welcome {}'.format(name)
 
@app.route('/login',methods = ['POST', 'GET'])
def login():
   if request.method == 'POST':
      user = request.form['nm']
      return redirect(url_for('success',name = user))
   else:
      user = request.args.get('nm')
      return redirect(url_for('success',name = user))
 
if __name__ == '__main__':
   app.run(debug = True)

6、Flask 模板
from flask import Flask,render_template
app = Flask(__name__)
 
@app.route('/')
def index():
   return render_template(‘index.html’)
 
if __name__ == '__main__':
   app.run(debug = True)

7、Flask 请求对象
@app.route('/login', methods=['POST', 'GET'])
def login():
    error = None
    if request.method == 'POST':
        if valid_login(request.form['username'],
                       request.form['password']):
            return log_the_user_in(request.form['username'])
        else:
            error = 'Invalid username/password'
    # 当请求形式为“GET”或者认证失败则执行以下代码
    return render_template('login.html', error=error)

8、文件上传
from flask import Flask, render_template, request
from werkzeug import secure_filename
app = Flask(__name__)
 
@app.route('/upload')
def upload_file():
     return render_template('upload.html')
	
@app.route('/uploader', methods = ['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
         f = request.files['file']
         f.save(secure_filename(f.filename))
         return 'file uploaded successfully'
		
if __name__ == '__main__':
    app.run(debug = True)

9、Flask 将表单数据发送到模板
from flask import Flask, render_template, request
app = Flask(__name__)
 
@app.route('/')
def student():
   return render_template('student.html')
 
@app.route('/result',methods = ['POST', 'GET'])
def result():
   if request.method == 'POST':
      result = request.form
      return render_template("result.html",result = result)
 
if __name__ == '__main__':
   app.run(debug = True)

10、Flask Cookies
from flask import Flask,render_template,request,make_response
 
app = Flask(__name__)
 
@app.route('/')
def index():
    return render_template('index.html')
 
@app.route('/setcookie', methods = ['POST', 'GET'])
def setcookie():
    if request.method == 'POST':
        user = request.form['nm']
        resp = make_response(render_template('readcookie.html'))     
        resp.set_cookie('userID', user)
        return resp
 
@app.route('/getcookie')
def getcookie():
    name = request.cookies.get('userID')    
    return '<h1>welcome '+name+'</h1>'
 
if __name__ == "__main__":
	app.run(debug=True)

11、Flask Sessions(会话)
$ python3 -c 'import os; print(os.urandom(16))'
b'm \xf8>]?\x86\xcf/y\x0e\xc5\xc7j\xc5/'
Session[key] = value
session.pop(key, None)

cookie和session的区别:
1,cookie的数据存放在客户的浏览器上,会话数据放在服务器上。
2,cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用会话。
3,session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用COOKIE。
4,单个的cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个的​​cookie。
5,所以个人建议:   
将登陆信息等重要信息存放为SESSION   
其他信息如果需要保留,可以放在COOKIE中
会话是客户端登录到服务器并注销服务器的时间间隔。需要在该会话中保存的数据会存储在服务器上的临时目录中。会为每个客户端的会话分配会话ID。
会话(session)是在cookies的基础上实现的,并且在cookies中使用加密的签名。这意味着用户可以查看cookie的内容,但是不能修改它,除非知道签名的密钥。要使用会话,你需要设置一个密钥。会话数据存储在饼干的顶部,服务器以加密方式对其进行签名。对于此加密,瓶应用程序需要一个定义的SECRET_KEY(密钥)。

12、Flask 重定向和错误
Flask.redirect(location, statuscode, response)
location参数是应该重定向响应的URL。
statuscode发送到浏览器标头,默认为302。
response参数用于实例化响应。
from flask import Flask, redirect, url_for, render_template, request
# Initialize the Flask application
app = Flask(__name__)
 
@app.route('/')
def index():
    return render_template('log_in.html')
 
@app.route('/login',methods = ['POST', 'GET'])
def login():
    if request.method == 'POST' and
        request.form['username'] == 'admin' :
        return redirect(url_for('success'))
    return redirect(url_for('index'))
 
@app.route('/success')
def success():
    return 'logged in successfully'
	
if __name__ == '__main__':
    app.run(debug = True)

from flask import Flask, redirect, url_for, render_template, request, abort
app = Flask(__name__)
 
@app.route('/')
def index():
    return render_template('log_in.html')
 
@app.route('/login',methods = ['POST', 'GET'])
def login():
    if request.method == 'POST':
        if request.form['username'] == 'admin' :
            return redirect(url_for('success'))
        else:
            abort(401)
    else:
        return redirect(url_for('index'))
 
@app.route('/success')
def success():
    return 'logged in successfully'
 
if __name__ == '__main__':
    app.run(debug = True)

13、Flask 响应
@app.errorhandler(404)
def not_found(error):
    resp = make_response(render_template('error.html'), 404)
    resp.headers['X-Something'] = 'A value'
    return resp

14、Flask消息闪烁
from flask import Flask, flash, redirect, render_template, request, url_for

app = Flask(__name__)

app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'

@app.route('/')

def index():

    return render_template('index.html')

@app.route('/login', methods = ['GET', 'POST'])

def login():

    error = None

   

    if request.method == 'POST':

        if request.form['username'] != 'admin' or \

            request.form['password'] != 'secret':

            error = 'Invalid username or password. Please try again!'

        else:

           flash('You were successfully logged in')

           return redirect(url_for('index'))

    return render_template('login.html', error = error)

if __name__ == "__main__":

    app.run(debug = True)

三、报错参考

1、RuntimeError
错误地址: session['username'] = 'coco' 未加密
RuntimeError: The session is unavailable because no secret key was set. Set the secret_key on the application to something unique and secret.
解决方法: 加密 app.secret_key = 'asfda8r9q3y9qy#%GFSD^%WTAfasdfasqwe' # 加密方式(密钥种子)

2、redis.exceptions.ConnectionError
错误 :redis 服务器未开启
redis.exceptions.ConnectionError: Error 111 connecting to 127.0.0.1:6379. Connection refused.
解决方法: 打开终端输入 redis-server

3、werkzeug.routing.BuildError
错误 :反向解析路由传参的参数名不对
werkzeug.routing.BuildError: Could not build url for endpoint 'first.art' with values ['d']. Did you forget to specify values ['id']?
解决方法:改一下反向解析后面的参数名即可

4、werkzeug.routing.BuildError
错误 : 反向解析过程中蓝图指向方法不一致
werkzeug.routing.BuildError: Could not build url for endpoint 'first.art' with values ['id']. Did you mean 'first.art1' instead?
解决方法:反向解析函数名和跳转页面定义的函数名一致

5、ValueError: urls must start with a leading slash
错误:子域名设置问题
解决方法:注意路由中引号内的斜线/不能缺少 url_prefix='/app'

6、sqlalchemy.exc.IntegrityError: (pymysql.err.IntegrityError) (1062, "Duplicate entry 'xiaoming' for key 'name'")
[SQL: INSERT INTO stuf1 (name, age) VALUES (%(name)s, %(age)s)]
[parameters: {'age': 18, 'name': 'xiaoming'}]
(Background on this error at: http://sqlalche.me/e/gkpj)
错误:重复添加不可重复数据
解决方法:注意唯一字段

7、sqlalchemy.orm.exc.UnmappedInstanceError
sqlalchemy.orm.exc.UnmappedInstanceError: Class 'builtins.list' is not mapped
错误:未标明的实例错误,添加数据内容写错了all_stus.append(stu) 错误时候写的是括号内(all_stus)
解决方法: 注意后台代码的准确性

8、TypeError
TypeError: not_() takes 1 positional argument but 2 were given
错误:flask框架中查询时,非not_,的参数是能有一个
解决方法:not_放在一个需要修饰的参数前面

9、AssertionError
View function mapping is overwriting an existing endpoint function: blue.hello
错误:视图函数路径指向有问题

10、sqlalchemy.exc.NoForeignKeysError
sqlalchemy.exc.NoForeignKeysError: Could not determine join condition between parent/child tables on relationship Grade.stus - there are no foreign keys linking these tables. Ensure that referencing columns are associated with a ForeignKey or ForeignKeyConstraint, or specify a 'primaryjoin' expression.
错误:定义模型类时关联字段有问题
解决方法:ForeignKey('grade_id') => ForeignKey('grade.id') 分清关联的是谁的哪个字段在sql语句中和Python中的不同写法

11、AttributeError: type object 'Integer' has no attribute '_set_parent_with_dispatch'
错误原因:模型类书写错误
解决方法:db.Column('s_id'),db.Integer,db.ForeignKey('stu.id')) => db.Column('s_id',db.Integer,db.ForeignKey('stu.id')) 把括号位置写对

12、# relationship为关联关系,backref为反向引用
stus = db.relationship('Student', backref='g')
错误: 移除数据,调用remove方法,当数据不存在的时候报错
解决方法:使用异常处理 try ... except

posted on 2022-06-21 01:10  突破%  阅读(113)  评论(0)    收藏  举报

导航