225.1.flask初体验

1.简单flaskweb

# coding=utf-8

from flask import Flask, render_template, request, redirect, session

app = Flask(__name__, template_folder="templates")

app.secret_key = "abc"


USER_DICT= {
    "1": {"name": "alex", "age": 19},
    "2": {"name": "big", "age": 19},
    "3": {"name": "people", "age": 19},
    "4": {"name": "person", "age": 19},
}

@app.route("/login", methods=["POST", "GET"])
def login():
    print("start")
    if request.method == "GET":
        return render_template("login.html")
    else:
        # request.args
        user = request.form.get("user")
        pwd = request.form.get("pwd")
        if user == "alex" and pwd == "123":
            session["user_info"] = user  # 放到浏览器cookie中
            return redirect("/index")
        else:
            return render_template("login.html", **{"msg": "login fail"})


@app.route("/index")
def index():
    user_info = session.get("user_info")
    if not user_info:
        return redirect("/login")

    return render_template("index.html", user_dict=USER_DICT)


@app.route("/detail")
def detail():
    user_id = request.args.get("user_id")
    return render_template("detail.html", user=USER_DICT.get(user_id))


@app.route("/lgout")
def lgout():
    user_info = session.get("user_info")
    if not user_info:
        return redirect("/login")

    return "欢迎"


@app.route("/test")
def test():
    dns = {
        'tcp_test': {
                'nameserver': ['dns1 223.5.5.5: 53', 'dns2 114.114.114.114: 53'],
                'hold': ['other 30s', 'refsed 30s', 'nx 30s', 'timeot 30s', 'valid 10s'],
                'resolve_retries': '3',
                'timeot': 'retry 1s'
            },
        'http_test': {
            'nameserver': ['dns1 223.5.5.5: 53', 'dns2 114.114.114.114: 53'],
            'hold': ['other 30s', 'refsed 30s', 'nx 30s', 'timeot 30s', 'valid 10s'],
            'resolve_retries': '3',
            'timeot': 'retry 1s'
            }
        }

    return render_template("test.j2", **{"dns": dns})


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

2.html文件

  • login.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>login</title>
</head>
<body>
<h1> 登录 </h1>
<form method="post">
    <input type="text" name="user">
    <input type="password" name="pwd">
    <input type="submit" name="submit"> {{ msg }}
</form>
</body>
</html>
  • index.html
  <!DOCTYPE html>
  <html lang="en">
  <head>
      <meta charset="UTF-8">
      <title>Title</title>
  </head>
  <body>

  {% for key, item in user_dict.items() %}
      <li src="/detail?uid={{ key }}">{{item.name}} {{item.age}} </li>
  {% endfor %}
  </body>
  </html>
  • detail.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<li>{{user.name}} {{user.age}}</li>
</body>
</html>

3.附加内容

"""
- 迭代器: 内部实现__next__方法, 帮助我们向后一个一个取值
- 生成器: 一个函数内不存在yield关键字: v = 函数()
        应用场景:
             - range/xrange
                - py2: xrange(1000000)
                - py3: range(1000000)
            - redis 中的hscan_iter
                - 每次取12个
            - stark组件
                - django 模板渲染时可以返回一个生成器对象
- 可迭代对象: 一个类内部实现了__iter__方法, 方法返回一个迭代器
    class Foo(object):
        def __iter__(self):
            return iter([1,2,3,4])
    obj = Foo()
    应用场景
        - wtforms中循环打印所有字段对象
        - LocalProxy
        - list, dict, tuple
        总结: 如果想要一个对象可以被循环, 必须有一个__iter__方法
- 装饰器: 不改变原函数代码的基础上, 在执行前后进行定制操作
    - 手写
    - 应用场景:
        - flask路由系统
        - flask before_request
        - csrf
        - django内置
        - functiontolls warp函数
"""

参考:这一系列flask都是老男孩2018年全栈8期
https://www.cnblogs.com/wupeiqi/aticles/7552008.html

posted @ 2022-06-02 13:32  楠海  阅读(38)  评论(0)    收藏  举报