keyfall / xuexibiji

3 stars 0 forks source link

Flask #25

Open keyfall opened 4 years ago

keyfall commented 4 years ago

安装flask

pip install flask

hello flask

新建hello.py文件 图片

运行hello.py python3 hello.py 浏览器输入这个地址,就可以了 这么写只能在本地浏览器浏览,使用宿主机进行浏览,使用下面的方法,把ip写成0.0.0.0

参数配置及使用

图片

threaded是使用多线程,因为python内部机制是单线程的,也导致了用不到100%的cpu,如果电脑是4核的,那cpu运用率不到25%,所以有了这个功能 图片 图片

上图中debugger pin是用来调试程序的 图片 图片 这个因为是在服务器会显示debugger pin,所以是方便管理员进行代码的检查

keyfall commented 4 years ago

命令行加载debug,reload,主机和端口

安装插件flask-script pip install flask-script

代码 图片

运行 图片

-d 开启debug -r 开启自动重启 -h 指定主机 -p 端口

keyfall commented 4 years ago

关键字参数

图片

any例子 图片

int例子 图片

keyfall commented 4 years ago

添加post请求

图片

反向解析

图片 格式:url_for('函数名',key=value,key=value)

keyfall commented 4 years ago

request

图片 图片 图片

获取args中的参数时,使用下面的,上面的如果参数名不对,会报错,下面的如果没有参数,会显示none,不会报错 getlist是针对两个参数名相同时,获取值的情况,如果用get获取的话,会获取前一个

response

1.使用render_template("hello.html") 图片 第二个参数,控制返回的状态码

2.通过make_response(a,b,c) a:返回内容,可以是render_template() b:状态码 c:表头 图片

3.自己创建response 图片

keyfall commented 4 years ago

ajax的坑

坑了我一天,现在写一下

先上代码吧 js


    <script type="text/javascript">
        $('#login').click(function(){
            var formData = $('#loginForm').serialize();
            $.ajax({
                url:'http://127.0.0.1:5000/addarticle',
                type:"POST",
                data:formData,
                dataType:"json",
                success:function(result){
                    alert('ok');
                    alert(result.abc)
                },
                error:function(data){
                    alert("请求出错");
                    alert(data);
                }
            });
        });

    </script>

flask

@app.route('/addarticle',methods=['GET','POST'])
def addarticle():
    if request.method == 'POST':
        if not request.form['title'] or not request.form['content'] \
                or not request.form['keyword'] or not request.form['description'] \
                or not request.form['updatetime']:
                    flash("Please enter all the fields",'error')
        else:
            time = datetime.strptime(request.form['updatetime'],'%Y-%m-%d').date()
            blog = blogs(request.form['title'],request.form['content'],request.form['keyword'],\
                    request.form['description'],time)
            db.session.add(blog)
            db.session.commit()
            return jsonify({'success':'ok','abc':'abcde'})
    return redirect(url_for('article'))

@app.route('/html',methods=['GET','POST'])
def html():
    return render_template("add-article.html")

说下flask中ajax的流程,从页面过来后,进入指定的url,这里是addarticle,然后post请求进入/html(这是ajax所在页面),意思就是不是直接跳回到ajax的html页面,而是通过路由进入到/html,然后进入ajax页面,所以需要在/html加入methods=['GET','POST'] 1.需要在html加入methods=['GET','POST'] 2.在ajax语句结束后,加入一个alert,才会进入success或者error(是加一个语句还是一行代码没试) 3.本来url使用的是‘127.0.0.1:5000/addarticle’进入的,然后就一直不成功,试了一天,到晚上了,不管是端口进入还是url_for进入都可以了,以后如果端口不行,就用url_for进行url设置,先避免一个错误 4.页面返回是用jsonify进行json转换jsonify({'success':'ok','abc':'abcde'})

keyfall commented 3 years ago

修改template地址

在Flask中使用template_folder属性 app = Flask(__name__,template_folder='../front') 这是设置template文件夹为当前py文件上一个文件夹下的front文件夹

最好不用上面的,照着官方写吧,因为我不清楚怎么使用static,前段老是引不到静态文件,看网上有人用蓝图可以 如果可以引到静态文件,那么就可以实现前后文件分离,前段写好,不用放到flask文件夹下static文件夹里

keyfall commented 3 years ago

flask缓存清除

修改样式时,发现总修改不过来,但是每次都清空浏览器缓存,不太方便,可以在app设置里进行缓存存在时间设置,来解决此问题 image

keyfall commented 3 years ago

蓝图

目的是使得flask拥有目录结构,url划分,before_request划分

image manage.py是启动文件 views是视图文件夹 manage.py

from sss import app

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

views.init.py

from flask import Flask

app = Flask(__name__)

from .views.account import ac
from .views.admin import ad
from .views.user import us

app.register_blueprint(ac)
app.register_blueprint(ad)
app.register_blueprint(us)

views.admin.py

from flask import Blueprint

#前缀名
ad = Blueprint('ad',__name__,url_prefix='/admin')

#部分前置
@ad.before_request
def bf():
    print('before_request')

@ad.route('/home')
def login():
    return 'home'
keyfall commented 3 years ago

项目依赖 pipreqs

优点: 搜索依赖库的范围是基于目录的方式,很有针对性 搜索的依据是脚本中所 import 的内容 可以在未安装依赖库的环境上生成依赖文件 查找软件包信息时,可以指定查询方式(只在本地查询、在 PyPi 查询、或者在自定义的 PyPi 服务)

pipreqs ./ --encoding=utf8

keyfall commented 3 years ago

threading.local

防止数据污染,假的全局变量,每个线程调用,都会在内存中复制一份,所以数据不会被污染 为每个线程开辟一块空间进行数据存储

from threading import Thread,local
import time

xl = local()

def ta(arg):
    xl.valuse = arg
    time.sleep(2)
    print(xl.valuse)

for i in range(10):
    t = Thread(target=ta, args=(i,))
    t.start()
keyfall commented 1 year ago

flask找不到模板文件夹

  1. 名称默认是templates,如果换成别的,需要在声明Flask时这样写 Flask(__name__, template_folder='/abc') 2.模板文件夹要和Flask()所在文件同目录,这是最重要的一点,否则声明了位置也找不到