flask的使用学习笔记1

跟着b站学的1-06 用户编辑示例_哔哩哔哩_bilibili

flask是一个轻量级,短小精悍,扩展性强,可以扩展很多组件,django大而全

编程语言它们的区别:

(这些语言都很了解,java和python是高级语言,都是由c语言开发的

c 很多语言的底层语言都是c,代码执行效率高,需要自己做内存管理,如果忘记销毁,,对代码要求比较高,很多功能需要手动实现

下面的,都帮助了做内存管理

c# 是微软开发的,部署需要放在windows server,正版需要花钱,很优雅

php 擅长写网页,快速搭建一个网站

java 面向对象,很多企业级应用都会选择java,

python 简洁,很快入门,在爬虫、机器学习、自动化有优势,有很多库,

go lang 语法和c接近,在处理并发有优势,保留了很多直接调用c语言实现的功能,docker是容器

如果遇到java题,不会可以用python,不能空着

构造函数和析构函数

构造函数:用于创建对象的函数

析构函数:用于销毁对象的函数

class people()

def new(self,*args,**kwargs):#构造函数

pass

#没写,但默认有

def del(self,*args,**kwargs):#析构函数

pass

obj=people()

del obj #销毁对象

重写和重载

创建:

manage.py和一个和项目名称相同的目录(static(前端生成的dist)、templates(html文件)、views里边有xx.py和__init__.py蓝图)

蓝图,构建目录结构

创建蓝图对象

使用

创建一个实例对象__name__可以写其它字符串,但一般是它

浏览器将请求给web服务器,web服务器将请求给app , app收到请求,通过路由找到对应的视图函数,然后将请求处理,得到一个响应response 然后app将响应返回给web服务器, web服务器返回给浏览器

路由和视图函数, 处理url和函数之间关系的程序,称为路由

在@app.route('/login',methods=['GET','POST'])就能接收POST请求

(get请求一般是去取获取数据,参数会放在url中

post请求一般是去提交数据,请求数据是放在body中)

request.method=='GET'#判断请求类型

render_template

从模版文件夹templates中呈现给定的模板上下文,可以跟参数,xx=xx或**{"xx":xx}

endpoint是别名 没有则默认函数名不能重名 ,redirect(url_for('idx别名'))

login.html 直接用{{}}获取值

<form> 元素 表示文档中的一个区域,此区域包含交互控件,用于向 Web 服务器提交信息

<input type="text" name="user">输入框的名称

jsonify

后端一般返回前端的数据就是json格式的响应数据,json格式的响应数据实际上是一个字符串

request.form

获取以POST方式提交的数据

request.form.get("user")方法根据表单元素的名称获取它的值

@auth 、@app.route是装饰器

redirect("/index") 执行路由A的时候会跳转执行路由B

装饰器

复制代码
装饰器是给现有的模块增添新的小功能,可以对原函数进行功能扩展
而且还不需要修改原函数的内容,也不需要修改原函数的调用
import functools
@functools.wraps(func) #不加上这个,打印的值不是函数名,而是inner

两个装饰器,先运行auth1

会话:session

登录成功 要保留会话 让index内容需要成功登录才能看到秘密内容

flask的session保存在:以加密形式保存在浏览器的cookie

需要app.secret_key

index和edit

nid = request.args.get('nid')

index.html

表格标签 border是表格线 tr行标签 th列头标签 td列标签

循环{% for key in xx.items() %}

{% endfor %}

获取值value['name'] value.name value.get('name')

<a href="/edit?nid={{key}}">编辑</a>

# ?nid={{key}}以nid的方式传参

获取参数request.args.get('nid')

edit.html

delete

整个代码

app.py

from flask import Flask,render_template,jsonify,request,redirect,url_for,session
import functools
#template_folder模板存放路径,默认为templates
app=Flask(__name__,template_folder="templates")
#session需要用到
app.secret_key='hggdxbt6t78ujkmoko'
DATA_DICT={#字典 全局变量
    1:{'name':'dog','age':'2'},
    2:{'name':'cat','age':'3'},
    3:{'name':'sheep','age':'8'},
    4:{'name':'pig','age':'5'},
}
#装饰器
def auth(func):
    @functools.wraps(func)
    def inner(*args,**kwargs):
        username = session.get('xxx')
        if not username:
            return redirect('/login')
        return func(*args,**kwargs)
    return inner

#在内部读取login 的url 再读取下面的函数,生成对应关系
@app.route('/login',methods=['GET','POST'])
#只能接收get请求 这样就能接收post了
def login():
    #判断请求类型
    if request.method=='GET':
        #return "login"
        return render_template("login.html")
        #login.htm 模板需要放在templates目录
        #return jsonify({"code":1000,"data":[1,2,3]})
        #字典
    #拿请求体传传过来的值
    print(request.form)
    user = request.form.get("user")
    pwd = request.form.get("pwd")
    if user == "zhangsan" and pwd == "123456":
        # 登录成功 要保留会话 让index内容需要成功登录才能看到
        # 不用session会 直接输网址会访问字典并修改
        # session的会话信息会保存在浏览器不是服务端
        session['xxx'] = 'zhangsan'
        return redirect("/index")
        # 跳转到新的一个页面
    #登陆失败
    error="用户名或密码错误"
    #return render_template("login.html",**{"error":error})
    #**打散
    return render_template("login.html", error=error)
    #自动放在字典里了
#endpoint是别名 没有则默认函数名不能重名
@app.route('/index',endpoint='idx')
@auth
def index():
    #判断
    data_dict=DATA_DICT
    return render_template('index.html',data_dict=data_dict)
#编辑
@app.route('/edit',methods=['GET','POST'])
@auth
def edit():
    nid = request.args.get('nid')
    nid = int(nid)
    if request.method == 'GET':
        #获取index.html中字典的ID参数 是字符串类型
        #弄一个页面
        info = DATA_DICT[nid]
        return render_template('edit.html',info=info)
    #获取ID的值
    #取POST请求的值 获取名称为 name和age输入框的值
    name = request.form.get('name')
    age = request.form.get('age')
    DATA_DICT[nid]['name']=name
    DATA_DICT[nid]['age']=age
    return redirect(url_for('idx'))

#删除
#/del/<int:nid> 在del后面可以接收一个值,并转换为int类型
#/del/<nid>会默认为字符串类型
@app.route('/del/<int:nid>')
@auth
def delete(nid):
    #删除
    del DATA_DICT[nid]
    #return redirect('/index')
    #别名
    return redirect(url_for('idx'))
#装饰器

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

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
      <h3>用户列表</h3>
      <!--表格标签  border是表格线 tr行标签 th列头标签-->
      <table border="1">
         <!--显示字典内容-->
        <thead>
          <tr>
            <th>ID</th>
            <th>用户名</th>
            <th>年龄</th>
            <th>操作</th>
          </tr>
        </thead>
        <tbody>
        <!--在这里items是函数,加上()会返回迭代器,才能遍历
        value['name'] value.age value.get('age','10')
        如果没有age的值。默认为10
        都能获得字典的内容
        td列标签
        -->
          {#这样的注释才对 <!---->是html的注释 #}
          {# #}
          {% for key,value in data_dict.items() %}
            <tr>
              <td>{{key}}</td>
              <td>{{value['name']}}</td>
              <td>{{value.get('age','10')}}</td>
              <td>
                <!--传递一些url
                ?nid={{key}}以nid的方式传参-->
                <a href="/edit?nid={{key}}">编辑</a>
                <a href="/del/{{key}}">删除</a>
              </td>
            </tr>
          {% endfor %}
        </tbody>
      </table>

</body>
</html>

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
    <h3>用户登录</h3>
    <!--表单-->
    <form method="POST">
        <input type="text" name="user">
        <input type="text" name="pwd">
        <input type="submit" value="提交">
        <!--差值表达式 显示结果-->
        <span style="color:red;">{{error}}</span>
    </form>
</body>
</html>

edit.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>修改</title>
</head>
<body>
    <h3>修改</h3>
    <!--提交是POST请求
    默认往当前页面提交 /edit/?nid=1-->
    <form method="post">
      <input type="text" name="name" value="{{info.name}}">
      <input type="text" name="age" value="{{info.age}}">
      <input type="submit" name="提交">
    </form>
</body>
</html>

运行结果:

问题:

当前无法使用此页面,127.0.0.1 重定向次数过多

参考网页无法正常运作127.0.0.1 将您重定向的次数过多。 尝试清除 Cookie. ERR_TOO_MANY_REDIRECTS---Django遇到的此状况的解决办法-CSDN博客

因为user获取失败(或者==None)会重定向无限循环导致的,每次重定向又会发送一个请求,满足重定向的条件循环

是因为login函数,不需要装饰器@auth

相关推荐
今天我又学废了1 小时前
scala学习记录,Set,Map
开发语言·学习·scala
Diamond技术流1 小时前
从0开始学习Linux——远程连接工具
linux·学习·centos·ssh·xshell·ftp
LUwantAC1 小时前
Java学习路线:Maven(三)继承关系
java·学习·maven
齐 飞1 小时前
MongoDB笔记02-MongoDB基本常用命令
前端·数据库·笔记·后端·mongodb
flying robot2 小时前
Go结构体(struct)
笔记
王俊山IT2 小时前
C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(1)
开发语言·c++·笔记·学习
RationalDysaniaer2 小时前
Gin入门笔记
笔记·gin
xing25162 小时前
张氏宗谱序言白话文翻译
笔记
gma9993 小时前
【Effective C++】阅读笔记3
c++·笔记
安冬的码畜日常4 小时前
【The Art of Unit Testing 3_自学笔记06】3.4 + 3.5 单元测试核心技能之:函数式注入与模块化注入的解决方案简介
笔记·学习·单元测试·jest