表单管理和上传文件

models:进行这一步首先要在mysql中创建名字为todoflask的数据库,且数据库的密码为redhat。

import random
import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
from flask_bootstrap import Bootstrap
from werkzeug.security import generate_password_hash, check_password_hash

"""
# session设置:
    1). 
    2). 
    3). 
app = Flask(__name__)  
app.config['SECRET_KEY'] = '123456'  
# or  
app.secret_key = '123456'  
# or  
app.config.update(SECRET_KEY='123456')  

"""

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:redhat@localhost/todoflask"  #连接数据库
app.config['SECRET_KEY'] = os.urandom(24)  #随机生成
Bootstrap(app)
db = SQLAlchemy(app)  # 实例化db对象

class User(db.Model):
    id = db.Column(db.Integer, autoincrement=True, primary_key=True)
    name = db.Column(db.String(50), unique=True)      # unique: 指定该列信息是唯一的;
    pwd = db.Column(db.String(100))      # 此处为了用户帐号的安全性, 必须对密码进行加密;
    email = db.Column(db.String(20), unique=True)
    phone = db.Column(db.String(20), unique=True)
    info = db.Column(db.Text)  # 个性简介
    addtime = db.Column(db.DateTime, default=datetime.now())
    userlogs = db.relationship('UserLog', backref="user")
    def check_pwd(self, pwd):
        return check_password_hash(self.pwd, 'redhat3')

class UserLog(db.Model):  # 用户登录日志
    id = db.Column(db.Integer, autoincrement=True, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    ip = db.Column(db.String(100))  # 登录的IP
    add_time = db.Column(db.DateTime, default=datetime.now())
    area = db.Column(db.String(100))  # 登录的城市

forms:

from flask_wtf import FlaskForm
from flask_wtf.file import FileRequired, FileAllowed
from wtforms import StringField, PasswordField, SubmitField, FileField
from wtforms.validators import DataRequired, EqualTo, Regexp, Email, ValidationError, Length
from models import User

class LoginForm(FlaskForm):
    name=StringField(
        label="用户名",
        validators=[
            DataRequired("请输入用户名!"),
            Length(3,20)
        ],
        render_kw={
            'placeholder':"请输入用户名",
            "class":"form-control"
        }
    )
    pwd=PasswordField(
        label="密码",
        validators=[
            DataRequired("请输入密码!")
        ],
        render_kw={
            'placeholder':"请输入密码",
            "class": "form-control"
        }
    )
    submit=SubmitField(
        render_kw={
            'value':"登录",
            'class':'btn btn-success pull-right'
        }
    )
class RegisterForm(FlaskForm):
    name=StringField(
        label="用户名",
        validators=[
            DataRequired("请输入用户名")
        ],
        render_kw={
            'placeholder':"请输入用户名"
        }
    )
    email=StringField(
        label="邮箱",
        validators=[
            DataRequired("请输入邮箱"),
            Email("邮箱格式不正确!")
        ],
        render_kw={
            'placeholder': "请输入邮箱",
        }
    )
    phone=StringField(
        label="电话号码",
        validators=[
            DataRequired("请输入电话"),
            Regexp('1\d{10}',message="手机格式不正确!")
        ],
        render_kw={
            'placeholder': "请输入电话号码",
        }
    )
    pwd=PasswordField(
        label="密码",
        validators=[
            DataRequired("请输入密码!")
        ],
        render_kw={
            'placeholder':"请输入密码",
            "class":"form-control"
        }
    )
    repwd=PasswordField(
        label="密码",
        validators=[
            DataRequired("请输入确认密码"),
            EqualTo('pwd',message="两次密码不一致!")
        ],
        render_kw={
            'placeholder':"请输入确认密码",
            "class":"form-control"
        }
    )
    submit=SubmitField(
        render_kw={
            'value':"登录",
            'class':'btn btn-success pull-right'
        }
    )
    def validate_name(self,field):
        name=field.data
        user=User.query.filter_by(name=name).count()
        if user==1:
            raise ValidationError("昵称已经存在")
    def validate_email(self,field):
        email=field.data
        user=User.query.filter_by(email=email).count()
        if user == 1:
            raise ValidationError("邮箱已经存在")
    def validate_phone(self,field):
        phone=field.data
        user=User.query.filter_by(phone=phone).count()
        if user == 1:
            raise ValidationError("电话号码已经存在")
class UploadForm(FlaskForm):
    file=FileField(
        label="简历",
        validators=[
            FileRequired(),
            FileAllowed(['pdf','txt'], '只接受.pdf和.txt格式的简历')
        ]
    )
    submit=SubmitField(
        render_kw={
            'value':"上传",
            'class':'btn btn-success pull-right'
        }
    )

wtfFlask:

from io import BytesIO
from werkzeug.security import check_password_hash, generate_password_hash
from forms import LoginForm, RegisterForm, UploadForm
from models import app, db, User, UserLog
from flask import render_template, redirect, url_for, request, flash, session, make_response
from functools import wraps
from urllib.request import urlopen
import json

def get_ip_area(ip):# 通过ip获取该IP的所在城市和国家;
    url = 'http://ip.taobao.com/service/getIpInfo.php?ip=%s' % (ip)# 构造url地址, 使用淘宝的API接口
    json_data = urlopen(url).read().decode('utf-8')# 获取页面返回的内容()
    s_data = json.loads(json_data)# 将json格式的数据转换为字典格式;
    country = s_data['data']['country']
    if country == 'XX':
        country = ''
    city = s_data['data']['city']
    if city == 'XX':
        city = ''
    return country + city

@app.route('/login/', methods=['POST', 'GET'])
def login():
    form = LoginForm()
    if request.method == 'POST':# 判断用户的HTTP请求方法
        data = request.form# 1). 接收提交的数据;
        name = data['name']
        pwd = data['pwd']
        u = User.query.filter_by(name=name).first()# 2). 判断用户名是否存在, 密码是否正确?
        if u and check_password_hash(u.pwd, pwd):
            session['user'] = u.name
            session['user_id'] = u.id
            userlog = UserLog(
                user_id=u.id,
                ip=request.remote_addr,
                area=get_ip_area(request.remote_addr)
            )
            db.session.add(userlog)
            db.session.commit()
            return "登录成功"
        else:
            flash('用户或者密码不正确!')# flash: 消息闪现,
            return redirect(url_for('login'))
    else:
        return render_template('login.html',form=form)

@app.route('/logout/')
def logout():
    session.pop('user', None)# 将会话中的key值弹出;
    session.pop('user_id', None)
    return redirect(url_for('login'))# 注销跳转到登录页面, 或者公共首页
@app.route('/register/',methods=['GET','POST'])
def register():
    form=RegisterForm()
    if form.validate_on_submit():
        data=form.data
        u=User(
            name=data['name'],
            pwd=generate_password_hash(data['pwd']),
            email=data['email'],
            phone=data['phone']
        )
        db.session.add(u)
        db.session.commit()
        flash('注册成功','ok')
        return redirect('/register/')
    return render_template('register.html',form=form)

@app.route('/upload/',methods=['POST','GET'])
def upload():
    form=UploadForm()
    if form.validate_on_submit():
        filename=form.file.data.filename
        form.file.data.save('/home/kiosk/PycharmProjects/Charm/day-27/doc'+filename)
        flash("上传成功",'ok')
        return redirect('/upload/')
    return render_template('upload.html',form=form)

@app.route('/code/')
def get_code():
    from doc.get_code import gene_code
    image,code=gene_code
    buf=BytesIO()
    image.save(buf,'png')
    buf_str=buf.getvalue()
    response=make_response(buf_str)
    response.headers['Content-Type']='image/png'
    session['code']=code
    return response
if __name__ == "__main__":
    app.run(port=9007)

下面写的就是前端页面,它们都写在文件夹templates

login.html

{% extends 'bootstrap/base.html' %}
{% block title %}用户登录{% endblock %}
{% block content %}
    <div class="col-md-8 col-md-offset-2">
        <form class="form-horizontal" action="{{ url_for('login') }}" method="post">
            <h2>用户登录</h2>
           {%  for error in get_flashed_messages()  %}
            <p style=" color:red;">{{ error }}</p>
            {% endfor %}
            <div class="form-group">
                <label class="col-sm-2 control-label">{{ form.name.label }}</label>
                <div class="col-sm-10">
{#                    <input type="text" class="form-control" name="name" placeholder="请输入用户名">#}
                    {{ form.name }}
                </div>
            </div>
            <div class="form-group">
                <label class="col-sm-2 control-label">{{ form.pwd.label }}</label>
                <div class="col-sm-10">
{#                    <input type="password" class="form-control" name="pwd" placeholder="请输入密码">#}
                    {{ form.pwd }}
                </div>
            </div>
            <div class="form-group">
                <div class="col-sm-offset-2 col-sm-10">
                    <div class="checkbox">
                        <label>
                            <input type="checkbox"> Remember me
                        </label>
                    </div>
                </div>
            </div>
            <div class="form-group">
                <div class="col-sm-offset-2 col-sm-10">
{#                    <button type="submit" class="btn btn-default">登录</button>#}
                    {{ form.submit }}
                </div>
            </div>
        </form>
    </div>
{% endblock %}

register.html

{% extends 'base.html' %}
{% import 'bootstrap/wtf.html' as wtf %}
{% block content %}
    <div class="col-md-6 col-md-offset-3">
        {% for msg in get_flashed_messages(category_filter='ok') %}         {#  显示闪现的所有信息   #}
            <div class="alert alert-success alert-dismissible" role="alert">
                <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span
                        aria-hidden="true">&times;</span>
                </button>
                <strong>Success!</strong> {{ msg }}.
            </div>
        {% endfor %}
        {% for msg in get_flashed_messages(category_filter='error') %}
            <div class="alert alert-warning alert-dismissible" role="alert">
                <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span
                        aria-hidden="true">&times;</span>
                </button>
                <strong>Warning!</strong> {{ msg }}.
            </div>
        {% endfor %}
        {{ wtf.quick_form(form) }}
    </div>
{% endblock %}

upload.html

{% extends 'base.html' %}
{% import 'bootstrap/wtf.html' as wtf %}
{% block content %}
    <div class="col-md-6 col-md-offset-2">
        <h3>上传简历</h3>
        {% for msg in get_flashed_messages(category_filter='ok') %}
            <div class="alert alert-success alert-dismissable" role="alert">
                <button type="button" class="close" data-dismiss="alert" 
                        aria-label="Close"><span aria-label="true">&times;</span>
                </button>
                <strong>Success!</strong>{{ msg }}
            </div>
        {% endfor %}
        {% for msg in get_flashed_messages(category_filter='error') %}
            <div class="alert alert-warning alert-dismissable" role="alert">
                <button type="button" class="close" data-dismiss="alert" 
                        aria-label="Close"><span aria-label="true">&times;</span>
                </button>
                <strong>Warning!</strong>{{ msg }}
            </div>
        {% endfor %}
        {{ wtf.quick_form(form) }}
    </div>
{% endblock %}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值