Flask(五)

一、导航条的实现

导航条的实现需要借助Bootstrap.

代码:(这只是实现导航条的相关代码,不包括主体代码)

继承:
{% extends "base.html" %}

{% block title %}问答-首页{% endblock %}

{% block head %}

{% endblock %}



父类:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}{% endblock %}</title>
    <link rel="stylesheet" href="{{url_for('static',filename='bootstrap/bootstrap@4.6.min.css')}}">
    {% block head %} {% endblock %}
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
  <div class="container">
  <a class="navbar-brand" href="#">问答</a>
  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
    <span class="navbar-toggler-icon"></span>
  </button>
  <div class="collapse navbar-collapse" id="navbarSupportedContent">
    <ul class="navbar-nav mr-auto">
      <li class="nav-item active">
        <a class="nav-link" href="#">首页 <span class="sr-only">(current)</span></a>
      </li>
      <li class="nav-item">
        <a class="nav-link" href="#">发布问答</a>
      </li>
         <li class="nav-item ml-2">
          <form class="form-inline my-2 my-lg-0">
            <input class="form-control mr-sm-2" type="search" placeholder="关键字" aria-label="Search">
            <button class="btn btn-outline-success my-2 my-sm-0" type="submit">搜索</button>
         </form>
    </li>
    </ul>
     <ul class="navbar-nav">
      <li class="nav-item">
        <a class="nav-link" href="#">登录 </a>
      </li>
      <li class="nav-item">
        <a class="nav-link" href="#">注册</a>
      </li>
    </ul>
    </div>
  </nav>
</div>
<div class="container">{% block body %}{% endblock %}</div>
</nav>
</body>
</html>

运行结果:

二、登录和注册页面的实现

base页面:

背景颜色:

body{
    background-color: #f3f3f3;   #在static中设置
}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}{% endblock %}</title>
    <link rel="stylesheet" href="{{url_for('static',filename='bootstrap/bootstrap@4.6.min.css')}}">
    <link rel="stylesheet" href="{{url_for('static',filename='css/init.css')}}">  #背景颜色
  {% block head %} {% endblock %}
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
  <div class="container">
  <a class="navbar-brand" href="#">问答</a>
  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
    <span class="navbar-toggler-icon"></span>
  </button>
  <div class="collapse navbar-collapse" id="navbarSupportedContent">
    <ul class="navbar-nav mr-auto">
      <li class="nav-item active">
        <a class="nav-link" href="#">首页 <span class="sr-only">(current)</span></a>
      </li>
      <li class="nav-item">
        <a class="nav-link" href="#">发布问答</a>
      </li>
         <li class="nav-item ml-2">
          <form class="form-inline my-2 my-lg-0">
            <input class="form-control mr-sm-2" type="search" placeholder="关键字" aria-label="Search">
            <button class="btn btn-outline-success my-2 my-sm-0" type="submit">搜索</button>
         </form>
    </li>
    </ul>
     <ul class="navbar-nav">
      <li class="nav-item">
        <a class="nav-link" href="{{url_for('user.login')}}">登录 </a>
      </li>
      <li class="nav-item">
        <a class="nav-link" href="{{url_for('user.register')}}">注册</a>
      </li>
    </ul>
    </div>
  </nav>
</div>
<div class="container">{% block body %}{% endblock %}</div>
</nav>
</body>
</html>

 登录:

{% extends "base.html" %}

{% block title %}问答-登录{% endblock %}

{% block head %}

{% endblock %}

{% block body %}
<div class="row mt-4">
  <div class="col"></div>
  <div class="col">
    <form>
      <div class="form-group">
        <label for="exampleInputEmail1">邮箱</label>
        <input type="email" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp">
        <small id="emailHelp" class="form-text text-muted">我们不会把邮箱用于其他用户</small>
      </div>
      <div class="form-group">
        <label for="exampleInputPassword1">密码</label>
        <input type="password" class="form-control" id="exampleInputPassword1">
      </div>
      <button type="submit" class="btn btn-primary btn-block">立即登录</button>
    </form>
  </div>
  <div class="col"></div>
</div>

{% endblock %}

 注册:

{% extends "base.html" %}

{% block title %}问答-注册{% endblock %}

{% block head %}

{% endblock %}

{% block body %}
<div class="row mt-4">
  <div class="col"></div>
  <div class="col">
    <form>
      <div class="form-group">
        <label for="exampleInputEmail1">邮箱</label>
        <input type="email" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp">
        <small id="emailHelp" class="form-text text-muted">我们不会把邮箱用于其他用户</small>
      </div>

      <div class="form-group">
        <label for="exampleInputEmail1">验证码</label>
        <div class="input-group">
          <input type="text" class="form-control">
                  <div class="input-group-append">
          <button class="btn btn-outline-secondary" type="button">获取验证码</button>
        </div>
        </div>

      </div>

      <div class="form-group">
        <label for="exampleInputPassword1">密码</label>
        <input type="password" class="form-control" id="exampleInputPassword1">
      </div>

      <div class="form-group">
        <label for="exampleInputPassword1">确认密码</label>
        <input type="password" class="form-control">
      </div>
      <button type="submit" class="btn btn-primary btn-block">立即登录</button>
    </form>
  </div>
  <div class="col"></div>
</div>
{% endblock %}

成果:

 

三、Flask发送邮件

#邮箱配置
#qq邮箱
MAIL_SERVER="smtp.qq.com"
MAIL_PORT=465
MAIL_USE_TLS=False
MAIL_USE_SSL=True
MAIL_DEBUG=True
MAIL_USERNAME="2780038443@qq.com"
MAIL_PASSWORD="mbycogecyswzdhff"
MAIL_DEFAULT_SENDER="2780038443@qq.com"


#exts.py:
from flask_sqlalchemy import SQLAlchemy
from flask_mail import Mail

db=SQLAlchemy()
mail=Mail()


#main.py:
from flask import Flask,Response,request,session,render_template
import config
from exts import db,mail
from blueprints import qa_bp
from blueprints import user_bp


app = Flask(__name__)
app.config.from_object(config)
db.init_app(app)
mail.init_app(app)

app.register_blueprint(qa_bp)
app.register_blueprint(user_bp)


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

 邮箱验证码存储:

#model.py:

from exts import db
from datetime import datetime

class EmailCpatchaModel(db.Model):
    __tablename__="email_captcha"
    id=db.Column(db.Integer,primary_key=True,autoincrement=True)
    email=db.Column(db.String(100),nullable=False,unique=True)
    captcha=db.Column(db.String(10),nullable=False)
    create_time=db.Column(db.DateTime,default=datetime.now)





#user.py:

import random
import string

from flask import Blueprint,render_template,request
from exts import mail,db
from flask_mail import Message
from models import EmailCpatchaModel
from datetime import datetime


bp=Blueprint("user",__name__,url_prefix="/user")

@bp.route("/login")
def login():
    return render_template("login.html")


@bp.route("/register")
def register():
    return render_template("register.html")


@bp.route("/captcha")
def get_captcha():
    email=request.args.get("email")
    letter=string.ascii_letters+string.digits
    captcha="".join(random.sample(letter,4))
    if email:
        message = Message(
            subject='邮箱测试',
            recipients=['2780038443@qq.com'],
            body=f"您的注册验证码是:{captcha},请不要告诉任何人哦!"
        )
        mail.send(message)
        captcha_model=EmailCpatchaModel.query.filter_by(email=email).first()
        if captcha_model:
            captcha_model.captcha=captcha
            captcha_model.create_time=datetime.now()
            db.session.commit()
        else:
            captcha_model=EmailCpatchaModel(email=email,captcha=captcha)
            db.session.add(captcha_model)
            db.session.commit()
        return "success"
    else:
        return "没有传递邮箱"


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值