zoukankan      html  css  js  c++  java
  • Flask01--入门

    1. 创建flask框架主程序

    名字可以是app.py/run.py/main.py/index.py

    from flask import Flask
    app = Flask(__name__) 
    
    @app.route('/')
    def index():
        return 'Hello World'
    
    if __name__ == '__main__':
        # 注意: flask默认端口5000
        app.run()
    

    2. 代码分析

    # 导入Flask类
    from flask import Flask
    
    """
    import_name      Flask程序所在的包(模块),传 __name__ 就可以
                     其可以决定 Flask 在访问静态文件时查找的路径
    static_path      静态文件访问路径(不推荐使用,使用 static_url_path 代替)
    static_url_path  静态文件访问路径,可以不传,默认为:/ + static_folder
    static_folder    静态文件存储的文件夹,可以不传,默认为 static
    template_folder  模板文件存储的文件夹,可以不传,默认为 templates
    """
    app = Flask(import_name=__name__)
    
    
    # 编写路由视图
    # flask的路由是通过给视图添加装饰器的方式进行编写的。当然也可以分离到另一个文件中。
    # flask的视图函数,flask中默认允许通过return返回html格式数据给客户端。
    @app.route(rule='/')
    def index():
        return '<mark>Hello Word!</make>'
    
    # 加载项目配置
    class Config(object):
        # 开启调试模式
        DEBUG = True
    
    # flask中支持多种配置方式,通过app.config来进行加载,我们会这里常用的是配置类
    app.config.from_object( Config )
    
    
    # 指定服务器IP和端口
    if __name__ == '__main__':
        # 运行flask
        app.run(host="0.0.0.0", port=5000)
    

    3. 案例:登录,显示用户信息

    main.py

    Copyfrom flask import Flask, render_template, request, redirect, session, url_for
    
    app = Flask(__name__)
    app.debug = True  # 调试模式
    app.secret_key = 'xxxx-xxxx-xxxx-xxxx'  # 跟djangosetting中的秘钥一个意思
    
    USERS = {
        1: {'name': '张三', 'age': 18, 'gender': '男', 'text': "道路千万条"},
        2: {'name': '李四', 'age': 28, 'gender': '男', 'text': "安全第一条"},
        3: {'name': '王五', 'age': 18, 'gender': '女', 'text': "行车不规范"},
    }
    
    
    @app.route('/detail/<int:nid>', methods=['GET'])
    def detail(nid):
        user = session.get('user_info')
        if not user:
            return redirect('/login')
    
        info = USERS.get(nid)
        return render_template('detail.html', info=info)
    
    
    @app.route('/index', methods=['GET'])
    def index():
        # 从session中拿出user_info
        user = session.get('user_info')
        if not user:
            # return redirect('/login')
            url = url_for('l1')  # 反向解析
            print(url)
            return redirect(url)
        return render_template('index.html', user_dict=USERS)
    
    
    @app.route('/login', methods=['GET', 'POST'], endpoint='l1')  # endpoint路由的别名,用作反向解析
    def login():
        if request.method == "GET":
            return render_template('login.html')
        else:
            # request.query_string
            # post提交过来的数据放在form中
            # get请求提交过来的数据query_string中
            user = request.form.get('user')w
            pwd = request.form.get('pwd')
            if user == 'lqw' and pwd == '123':
                # 往session中放入key和value
                session['user_info'] = user
                return redirect('/index')
            return render_template('login.html', error='用户名或密码错误')
    
    # 分析源码以后的路由写法
    def xxx():
        return 'xxx'
    
    
    app.add_url_rule('/xxx', view_func=xxx)
    
    if __name__ == '__main__':
        app.run()
    

    detail.html

    Copy<!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h1>详细信息 {{ info.name }}</h1>
    <div>
        {{ info.text }}
    </div>
    </body>
    </html>
    

    index.html

    Copy<!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h1>用户列表</h1>
    <table>
        {% for k,v in user_dict.items() %}
            <tr>
                <td>{{ k }}</td>
                <td>{{ v.name }}</td>
                <td>{{ v['name'] }}</td>
                <td>{{ v.get('name') }}</td>
                <td><a href="/detail/{{ k }}">查看详细</a></td>
            </tr>
        {% endfor %}
    </table>
    </body>
    </html>
    

    login.html

    Copy<!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h1>用户登录</h1>
    <form method="post">
        <input type="text" name="user">
        <input type="text" name="pwd">
        <input type="submit" value="登录">{{ error }}
    </form>
    </body>
    </html>
    

    4. 总结

    # Flask三板斧:
        return '<mark>字符串</mark>'  # 提示: 支持HTML语法
        return render_template('index.html')
        return redirect('/login')
    
    # 路由写法(路径,支持的请求方式,别名)
        # 基本的路由写法
        @app.route('/login',methods=['GET','POST'],endpoint='l1')
        # 分析源码以后的路由写法
        def xxx():
            return 'xxx'
        app.add_url_rule('/xxx', view_func=xxx)
    
    # 模板语言渲染
        同dtl,但是比dtl强大,支持加括号执行,字典支持中括号取值和get取值
    
    # 分组(django中的有名分组)
        @app.route('/detail/<int:nid>',methods=['GET'])
        def detail(nid):
    
    # 反向解析
        url_for('别名')
    
    # 获取前端传递过来的数据
        # get 请求
            request.query_string
        # post请求
            user = request.form.get('user')
            pwd = request.form.get('pwd')
    
    永远不要高估自己
  • 相关阅读:
    项目的搭建步骤:
    MySQL复习笔记记录
    记录搭建SSM框架中常用到的功能:(监听器)、过滤器和拦截器 以及相关的拓展内容的学习记录
    为什么要配置spring**.xml或者applicationContext.xml --学习笔记
    java8 Lambda表达式学习笔记
    java多线程高并发学习从零开始——初识volatile关键字
    java多线程高并发学习从零开始——新建线程
    JVM工作机制以及异常处理之内存溢出OOM(OutOfMemoryError)/SOF(StackOverflowError)--Java学习记录2——更新中
    记录使用idea构建出现错误:failed to execute goal org.apache.maven.plugins:maven-javadoc-plugin:2.9.1:jar——Java学习记录3
    Oracle创建用户和表空间的步骤 和 导入dmp文件的方法 —— 数据库学习
  • 原文地址:https://www.cnblogs.com/liqiangwei/p/14401156.html
Copyright © 2011-2022 走看看