flask入门

flask入门

创建虚拟环境

python3创建方法;

1.pip install python3-env

2.python3 -m venv <虚拟环境文件名> 或者 python -m venv <虚拟环境名字>

3.进入该虚幻环境 并激活 激活指令activate

4.退出虚拟环境 deactivate

python2创建方法:

  1. pip install virtualenv
  2. virtualenv <虚拟环境名>
  3. 进入该虚幻环境 并激活 激活指令activate
  4. 退出虚拟环境 deactivate

一个基本flask项目目录结构

flask
├── app 该项目文件
│ ├──__ init__.py 初始化文件
│ ├── routes.py 路由设置
│ └── templates 模板文件
│ ├── base.html
│ └── index.html
├── run.py 启动文件

|—–congfig.py 配置文件

路由route
# @app.route是一个装饰器
# 装饰器作用是  做一个url与试图函数的映射
# 通过127.0.0.1:5000/hello 可以请求hello()视窗函数
@app.route("/hello/")
def hello(id):
    return "请求参数是 " + id

设置debug模式

作用:项目运行中如果修改了某些代码,会自动重新加载项目

f __name__ == "__main__":
    #这个项目运行,是一个监听的状态,一直运行
    #while(True):
    #    listen();
    #app.run(host,port,debug,options);都是可变参数
    app.run()

url传参数

作用:1.可以相同的url下获得不同的数据

2.在flask如何使用参数

@app.route("/hello/<id>")
def hello(id):
    return "请求参数是 " + id



#反转url  通过视窗函数获得url
#使用url_for("视窗函数"),url("视窗函数",“参数”)来获得url
@app.route("/")
def index():
    print(url_for("my_list"))
    print (url_for("hello",id=3))
    return "hello world "
###当视窗函数有参数时,要传参数。
###好处:页面重定向,页面跳转的时候

#简单实现重定向
##重定向方法:redirect
@app.route("/login")
def login():
    return "这是登陆界面"
@app.route("/logined")
def logined():
    return "这是登陆后的界面"

@app.route("/index/<is_login>")
def index(is_login):
    if is_login=="1":
        logined_url=url_for("logined")
        return redirect(logined_url)
    else:
        login_url=url_for("login")
        return redirect(login_url)
#说明:本来是index界面,通过简单的判断,来重定向返回不同的界面。
#####  如果参数是1,那么判断返回登陆后的界面,否则返回登陆界面



模板templates

Flask渲染jinja2模板和传参
  • 模板放在templates文件下
  • 从flask中导入render_template方法渲染模板
  • 注意:在视图函数中返回render_template(“模板名”),不需要填写templates路径
#1.模板传参
##index.html 文件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>first</title>
</head>
<body>
<!-- {{username}}是一个flask语法>
<p> 你好:{{username}}</p>
</body>
</html>

##2.模板渲染。返回index.html模板,同时返回了一个参数username
@app.route("/")
def index():
    return render_template("index.html",username="zhangchuan")

#3.返回多个参数
##使用可变参数,一次返回多个参数
@app.route("/")
def index():
    context={"name":"张川",
             "gender":"男",
             "is_handsome":"yes"}
    return render_template("index.html",username="zhangchuan",**context)

#4.访问模型中字典或者对象的属性
##使用{{params.property}}形式,也可以是{{params["property"]}},
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>first</title>
</head>
<!--用python获取字典某键的value方法>
<p> 百度:{{websites["baidu"]}}</p>
<p>google:{{websites["google"]}}</p>

<!--第二种 websites.baidu 方法>
<p> 百度:{{websites.baidu}}</p>
<p>google:{{websites.google}}</p>
<body>

@app.route("/")
def index():
    context={"name":"张川",
             "gender":"男",
             "is_handsome":"yes",
             "websites":{"baidu":"www.baidu.com",
            "google":"www.google.com"}}
    return render_template("index.html",**context)



在模板中使用python语句

语法:{% python语句 %}

{%end for%}

#注意结束语句 {%end for%}


过滤器

作用:处理变量

语法:

{{params|default(new params)}}

default过滤器:如果avater参数不存在,就返回|后的参数

还有其他过滤器查找官网。


模板继承和使用block

#继承base.html界面

{%extends base.html%}

{%block%}

//内容

{%endblock%}


这是base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>

    <style>
        .index{
            background: #3a3a3a;
            height:65px;
        }
        ul li{
            float:left;
            list-style:none;
            padding:0 10px;
            line-height: 65px;
        }
        ul li a{
            color: #ffffff;

        }
    </style>
</head>
<body>
    <div class="index">
        <ul>
            <li><a href="url_for("index")">首页</a></li>
            <li><a href=url_for("login")>登录</a></li>
            <li><a href="urll_for("register") >注册</a></li>
        </ul>
    </div>

{%block main%}{%endblock%}


</body>
</html>




继承的界面

<!--这是首页继承base.html页面--!>
{% extends 'base.html'%}
{%block main%}
    <h1>这是首页</h1>
{%endblock%}


<!--这是登录界面继承base.html页面--!>
{% extends "base.html"%}
{%block main%}
    <h1>这是登录界面</h1>
{%endblock%}


加载静态文件

j加载图片,加载css,视屏,js都是如此
语法:{{url_for(‘static’,filename=‘css/index.css’)}}
{{url_for(‘static’,filename=‘images/follow.ico’)}}


数据库配置

在_init_.py中使用添加如下

from flask-sqlalchemy import SQLAlchemy
app=Flask(__name__)
#建立数据库关系
db=SQLAlchemy(app)



在config.py中添加

#数据库格式 dialect+driver://username:password@host:port/database
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123456@localhost:3306/flask-blog'
SQLALCHEMY_TRACK_MODIFICATIONS =False

在models.py中创建数据库模型

使用SQlAlchemy实现app应用与数据库的绑定

ORM对象关系映射

面向对象概念 面向关系概念
对象 一条记录
属性 字段
#创建数据库模型
class User(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True,autoincrement=True)
    username = db.Column(db.String(64), index=True, unique=True)
    email = db.Column(db.String(120), index=True, unique=True)
    password_hash = db.Column(db.String(128))
    db.create_all()

使用Migrate库实现数据库模型映射到数据库中

创建manage.py

from flask_migrate import Migrate,MigrateCommand
from flask_script import Manager
from app import app,db
from app.models import  User,Blog


"""
flaskweb应用实例app与数据库绑定,使用Migrate库 方便操作web应用与数据库

数据库模型迁移:   模型--->迁移文件-->数据库中表创建

"""
manager=Manager(app)

#绑定app和数据库,以便进行操作web应用app与数据库
migrate = Migrate(app,db)
#把MigrateCommand命添加到manager中
manager.add_command('db',MigrateCommand)

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

之后使用cmd进入该项目虚拟环境输入命令:

  1. python manage.py db init 首先使用init命令初始化环境
  2. python manage.py db migrate 生成迁移文件migrations
  3. python mannage.py db <migrations中的一些指令>

curd操作增删改查

	user1=User(username="zhangsan",email="21321242@qq.com")
    #添加到会话
    db.session.add(user1)
    #提交,才会增加到数据库中
    db.session.commit()

flask中的seesion机制

把敏感数据经过加密放入‘session’中,再放入浏览器中的cookie中,下次请求的时候,读取浏览器发送的cookie中读取session,最后读取session解密获取数据。。

flask把所有敏感数据都放入了浏览器中。


操作session

操作session就与操作字典一样

1.添加session

session[‘username’]=‘zhangsan’

2.删除

session.pop(‘username’)

3.删除所有session

session.clear()

4.获取session

session.get(‘username’)

实例:

#使用session需要设置一个SERCRET_KEY,作为加密使用的
import os
app.config['SECRET_KEY']=os.urandom(24)

@app.route('/')
def index():
   	session['username']='zhangsan'
    return 'hello world'

这样就给 ‘username’:‘zhangsan’这条信息加密了

并且flask自动将其放在session中并放入了浏览器的cookie中

注意:由于是随机给的24位的SERCRET_KEY 所以每次重新运行服务器的时候,每次加密的就不一样,就会导致不能正确解析 加密信息。所以可以写死SERCRET_KEY,这样每次重新运行服务器也可以解析加密信息。

浏览器中查看cookie 。
在这里插入图片描述


flask请求对象request

一些属性和方法

在这里插入图片描述
在这里插入图片描述

flask响应对象response

在这里插入图片描述


post和get请求获取参数

1.get请求是通过“flask.request.args”获取

2.post请求时通过“flask.request.form”获取表单数据

3.post请求获取表单数据注意事项

​ *input标签中需要使用name标识这个value的key,方便后台获取数据

​ *form表单需要指明method=‘POST’,action="/login/"或者“{{url_for(‘login’)}}”来指明哪个链接,也就是哪个视窗函数来接收这个表单数据

示例代码

form aciton="{{url_for('register')}}" method="POST">
    <div class="form-container">
        <div class="form-group">

            <input type="text" class="form-control" name='telephone'placeholder="手机号码">
        </div>
        <div class="form-group">
            <input type="password" class="form-control" name='password' placeholder="密码">
        </div>
        <div class="form-group">
            <button class="btn btn-primary btn-block">注册</button>
        </div>
    </div>


</form>

后台代码:

@app.route("/register/",methods=["GET","POST"])
def register():
    if request.method=="GET":
        return render_template("register.html")
    else:
        #获取表单数据
        telephone = request.form.get("telephone")
        password=request.form.get('password')

个人博客项目效果图。需要de,移步我的资源: https://download.csdn.net/download/weixin_43919632/11424229
在这里插入图片描述

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读