【Flask基础】八,Flask数据库操作(增删改查)

一,原生Mysql

  • 导入方式:import pymysql
  • 安装方式:pip install pymysql
  • 教程直通车:
    【http://runoob.com】https://www.runoob.com/python3/python3-mysql.html
    【w3cschool】https://www.w3cschool.cn/mysql/
    【个人博客】https://www.cnblogs.com/sunBinary/p/12416792.html

1.常规操作流程

import pymysql
from pymysql.cursors import DictCursor

# 【第一步】:连接到MySQL数据库
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='199596',
                       charset='utf8', database='flaskp_boke', autocommit=True)
print(conn.get_server_info())#打印数据库信息

# 【第二步】:执行SQL语句
# 1. 实例化一个游标对象,2. 定义SQL语句,3.通过游标执行,4,处理执行结果
cursor = conn.cursor()
sql = "select * from users"
cursor.execute(sql)
result = cursor.fetchall()
print(result)
"""
    为元祖套元祖
    ((1, 'woniu@woniuxy.com', 'e10adc3949ba59abbe56e057f20f883e', '蜗牛', '1.png', '12345678', 'admin', 5034, datetime.datetime(2020, 2, 5, 12, 31, 57), datetime.datetime(2020, 2, 12, 11, 45, 57)), (2, 'qiang@woniuxy.com', 'e10adc3949ba59abbe56e057f20f883e', '强哥', '2.png', '33445566', 'editor', 558, datetime.datetime(2020, 2, 6, 15, 16, 55), datetime.datetime(2020, 2, 12, 11, 46, 1)), (3, 'denny@woniuxy.com', 'e10adc3949ba59abbe56e057f20f883e', '丹尼', '3.png', '226658397', 'user', 84, datetime.datetime(2020, 2, 6, 15, 17, 30), datetime.datetime(2020, 2, 12, 11, 46, 8)), (4, 'reader1@woniuxy.com', 'e10adc3949ba59abbe56e057f20f883e', 'reader1', '8.png', '12345678', 'user', 53, datetime.datetime(2020, 2, 16, 13, 50, 12), datetime.datetime(2020, 2, 16, 13, 50, 12)), (5, 'reader2@woniuxy.com', 'e10adc3949ba59abbe56e057f20f883e', 'reader2', '6.png', '12345678', 'user', 77, datetime.datetime(2020, 2, 16, 14, 56, 37), datetime.datetime(2020, 2, 16, 14, 56, 37)), (6, 'reader3@woniuxy.com', 'e10adc3949ba59abbe56e057f20f883e', 'reader3', '13.png', '12345678', 'user', 64, datetime.datetime(2020, 2, 16, 14, 59, 12), datetime.datetime(2020, 2, 16, 14, 59, 12)), (7, 'tester@woniuxy.com', 'e10adc3949ba59abbe56e057f20f883e', 'tester', '9.png', '12345678', 'user', 56, datetime.datetime(2020, 2, 23, 3, 38, 34), datetime.datetime(2020, 2, 23, 3, 38, 34)))

"""
# 一般情况下,不建议使用下标获取列的值(但是可以获取到)
# 建议使用Key-Value来获取数据(Key==>列名,Value==>单元格的值)
# 代码可读性更强,代码维护起来更加高效
# 建议面对一些复杂的SQL,先在Navicat调试完成后再整合到代码中
cursor = conn.cursor(DictCursor)  #字典游标
sql = "select * from users where userid=3"
cursor.execute(sql)
result = cursor.fetchall()
print(result)
"""
    为列表套字典
    [{'userid': 3, 'username': 'denny@woniuxy.com', 'password': 'e10adc3949ba59abbe56e057f20f883e', 'nickname': '丹尼', 'avatar': '3.png', 'qq': '226658397', 'role': 'user', 'credit': 84, 'createtime': datetime.datetime(2020, 2, 6, 15, 17, 30), 'updatetime': datetime.datetime(2020, 2, 12, 11, 46, 8)}]

"""
# 更新操作需要执行commit指令
sql = "update users set qq='12345678' where userid=4"
cursor.execute(sql)
conn.commit()   # 提交修改:update, insert, delete

# 【第三步】:关闭数据库连接
cursor.close()
conn.close()

2.数据库 增/删/改/查

  • 增加数据
#!/usr/bin/python3
 
import pymysql
 
# 打开数据库连接
db = pymysql.connect(host='localhost',
                     user='testuser',
                     password='test123',
                     database='TESTDB')
 
# 使用cursor()方法获取操作游标 
cursor = db.cursor()
 
# SQL 插入语句
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
         LAST_NAME, AGE, SEX, INCOME)
         VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
try:
   # 执行sql语句
   cursor.execute(sql)
   # 提交到数据库执行
   db.commit()
except:
   # 如果发生错误则回滚
   db.rollback()
 
# 关闭数据库连接
db.close()
  • 删除数据
#!/usr/bin/python3
 
import pymysql
 
# 打开数据库连接
db = pymysql.connect(host='localhost',
                     user='testuser',
                     password='test123',
                     database='TESTDB')
 
# 使用cursor()方法获取操作游标 
cursor = db.cursor()
 
# SQL 删除语句
sql = "DELETE FROM EMPLOYEE WHERE AGE > %s" % (20)
try:
   # 执行SQL语句
   cursor.execute(sql)
   # 提交修改
   db.commit()
except:
   # 发生错误时回滚
   db.rollback()
 
# 关闭连接
db.close()
  • 修改数据
#!/usr/bin/python3
 
import pymysql
 
# 打开数据库连接
db = pymysql.connect(host='localhost',
                     user='testuser',
                     password='test123',
                     database='TESTDB')
 
# 使用cursor()方法获取操作游标 
cursor = db.cursor()
 
# SQL 更新语句
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M')
try:
   # 执行SQL语句
   cursor.execute(sql)
   # 提交到数据库执行
   db.commit()
except:
   # 发生错误时回滚
   db.rollback()
 
# 关闭数据库连接
db.close()
  • 查询数据
    在这里插入图片描述
#!/usr/bin/python3
 
import pymysql
 
# 打开数据库连接
db = pymysql.connect(host='localhost',
                     user='testuser',
                     password='test123',
                     database='TESTDB')
 
# 使用cursor()方法获取操作游标 
cursor = db.cursor()
 
# SQL 查询语句
sql = "SELECT * FROM EMPLOYEE \
       WHERE INCOME > %s" % (1000)
try:
   # 执行SQL语句
   cursor.execute(sql)
   # 获取所有记录列表
   results = cursor.fetchall()
   for row in results:
      fname = row[0]
      lname = row[1]
      age = row[2]
      sex = row[3]
      income = row[4]
       # 打印结果
      print ("fname=%s,lname=%s,age=%s,sex=%s,income=%s" % \
             (fname, lname, age, sex, income ))
except:
   print ("Error: unable to fetch data")
 
# 关闭数据库连接
db.close()

二,SQLAlchemy

  • 导入方式:import sqlalchemy
  • 安装方式:pip install sqlalchemy
  • 教程直通车:
    【51job】https://www.jb51.net/article/197296.htm
    【个人博客】http://www.zzvips.com/article/93197.html

1.数据库连接(别管用不用,上来就是一通导入)

from sqlalchemy import create_engine, Column, Integer, String, DateTime, Table, \
    MetaData, or_, func, and_
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, session, scoped_session

engine = create_engine('mysql+pymysql://root:199596@localhost/flaskp_boke', echo=False)
DBsession = sessionmaker(bind=engine)
dbsession = scoped_session(DBsession)   # 线程安全
Base = declarative_base()
md = MetaData(bind=engine)

2.数据库 增/删/改/查

  • 通过表模型创建表
    一般不会这么创建表,肯定是先在navicate中创建好表结构然后在代码中使用
from sqlalchemy import create_engine, Column, Integer, String, DateTime, Table, \
    MetaData, or_, func, and_
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, session, scoped_session

engine = create_engine('mysql+pymysql://root:199596@localhost/flaskp_boke', echo=False)
DBsession = sessionmaker(bind=engine)
dbsession = scoped_session(DBsession)   # 线程安全
Base = declarative_base()
md = MetaData(bind=engine)


# 定义模型类   【不会这么创建表,肯定是先在navicate中创建好表结构然后在代码中使用】
class Users(Base):
    __tablename__ = "userx"

    # 如果需要在SQLAlchemy里面直接创建表结构,则详细定义列
    userid = Column(Integer, primary_key=True)
    username = Column(String(50))
    password = Column(String(32))
    nickname = Column(String(30))
    qq = Column(String(15))
    role = Column(String(10))
    credit = Column(Integer)
    createtime = Column(DateTime)
    updatetime = Column(DateTime)
Users.metadata.create_all(engine)   # 创建表
  • 数据表操作前需要先将表结构导入
class Users(Base):
    __table__ = Table('users', md, autoload=True) #表名  原数据  自动加载表结构

class Article(Base):
    __table__ = Table('article', md, autoload=True)

class Comment(Base):
    __table__ = Table('comment', md, autoload=True)
  • 增加数据库数据
from sqlalchemy import create_engine,  MetaData, or_, func, and_
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, session, scoped_session

engine = create_engine('mysql+pymysql://root:199596@localhost/flaskp_boke', echo=False)
DBsession = sessionmaker(bind=engine)
dbsession = scoped_session(DBsession)   # 线程安全
Base = declarative_base()
md = MetaData(bind=engine)

class Users(Base):
    __table__ = Table('users', md, autoload=True) #表名  原数据  自动加载表结构

class Article(Base):
    __table__ = Table('article', md, autoload=True)

class Comment(Base):
    __table__ = Table('comment', md, autoload=True)

# 新增
user = Users(username='reader5@woniuxy.com',
                 password='e10adc3949ba59abbe56e057f20f883e', role='user', credit=5)
dbsession.add(user)
dbsession.commit()      # 修改类操作需要手工提交
  • 查询数据库数据
    在这里插入图片描述
from sqlalchemy import create_engine,  MetaData, or_, func, and_
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, session, scoped_session

engine = create_engine('mysql+pymysql://root:199596@localhost/flaskp_boke', echo=False)
DBsession = sessionmaker(bind=engine)
dbsession = scoped_session(DBsession)   # 线程安全
Base = declarative_base()
md = MetaData(bind=engine)

class Users(Base):
    __table__ = Table('users', md, autoload=True) #表名  原数据  自动加载表结构

class Article(Base):
    __table__ = Table('article', md, autoload=True)

class Comment(Base):
    __table__ = Table('comment', md, autoload=True)

    # 基础单表查询汇总, 直接打印一个类的时候,具体打印什么内容,由类的__repr__魔术方法决定,可以重写
# select userid, username from users   结果为列表包元祖[(1, 'woniu@woniuxy.com'), (2, 'qiang@woniuxy.com')]
result = dbsession.query(Users.userid, Users.username).all()

# select * from users where userid=1 and qq='12345678'
result = dbsession.query(Users).filter_by(userid=1, qq='123456789').all()

# select * from users where userid>7 or nickname='丹尼'
result = dbsession.query(Users).filter(or_(Users.userid>7, Users.nickname=='丹尼')).all()

# select * from users limit 3
result = dbsession.query(Users).limit(3).all()

# select * from users limit 3,5
result = dbsession.query(Users).limit(5).offset(3).all()

# select count(*) from users where ....
count = dbsession.query(Users).filter(Users.userid > 3).count()
    print(count)

# select distinct(qq) from users  #去重(几乎用不到)-- distinct(Users.qq)对应哪一列进行去重
result = dbsession.query(Users.qq).distinct(Users.qq).all()

# select * from users order by userid desc
result = dbsession.query(Users).order_by(Users.userid.desc()).all()

# select * from users where username like '%qiang%' 模糊查询
result = dbsession.query(Users).filter(Users.username.like('%qiang%')).all()

# select * from users group by role 兼有去重功能--用的比较多
result = dbsession.query(Users).group_by(Users.role).all()
# 分组后再加条件就必须用having
result = dbsession.query(Users).group_by(Users.role).having(Users.userid>2).all()

# 聚合函数:min, max, avg, sum
# select sum(credit) from users
result = dbsession.query(func.sum(Users.credit)).first()
# filter: == >= > <= < != in not

    # 多表查询汇总
# 多表连接查询: select * from article inner join users on article.userid=users.userid where article.articleid=1
# 多表连接查询时,返回的结果集不再是单纯的[Model, Model]数据结构,而是每张表的结果有独立的对象来维护
result = dbsession.query(Article, Users).join(Users, Article.userid == Users.userid).filter(Article.articleid==1).all()
result = dbsession.query(Article.articleid, Article.headline, Users.nickname).join(Users, Article.userid == Users.userid).filter(Article.articleid==1).all()

print(result)
for article,users in result:
    print(article.articleid,article.headline,users.userid,users.username)
for articleid, headline, nickname in result:
    print(articleid, headline, nickname)


# 外连接:查询每一个用户发表过的文章的阅读总量, outerjoin默认为左外连接
# select users.userid, users.nickname, sum(article.readcount) as total from users left join article
# on users.userid=article.userid group by (users.userid)
result = dbsession.query(Users.userid, Users.nickname, func.sum(Article.readcount))\
        .outerjoin(Article, Users.userid==Article.userid).group_by(Users.userid).all()
print(result)


# 复杂查询: and和or混用,username like 'qiang' or (userid>3 and nickname='reader3')
result = dbsession.query(Users).filter(or_(Users.username.like('%qiang%'), and_(Users.userid>3, Users.nickname=='reader3'))).all()
result = dbsession.query(Users).filter(and_(Users.username.like('%qiang%'), or_(Users.userid>3, Users.nickname=='reader3'))).all()
result = dbsession.query(Users).filter(Users.username.like('%qiang%'), or_(Users.userid>3, Users.nickname=='reader3')).all()
for row in result:
    print(row.userid, row.username)


# 三表连接
result = dbsession.query(Comment, Users).join(Users, Comment.userid==Users.userid)\
        .join(Article, Article.articleid==Comment.articleid).all()
print(result)
  • 数据库数据更新
from sqlalchemy import create_engine,  MetaData, or_, func, and_
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, session, scoped_session

engine = create_engine('mysql+pymysql://root:199596@localhost/flaskp_boke', echo=False)
DBsession = sessionmaker(bind=engine)
dbsession = scoped_session(DBsession)   # 线程安全
Base = declarative_base()
md = MetaData(bind=engine)

class Users(Base):
    __table__ = Table('users', md, autoload=True) #表名  原数据  自动加载表结构

class Article(Base):
    __table__ = Table('article', md, autoload=True)

class Comment(Base):
    __table__ = Table('comment', md, autoload=True)

【单独功能使用】
query = dbsession.query(Users)
xm_user = query.filter(Users.user_name == '小华').first()
xm_user.name = 'robin'
dbsession.commit()


【链式使用】
row = dbsession.query(Users).filter_by(userid=9).first()
row.username = 'reader6@woniuxy.com'
dbsession.commit()
  • 数据库数据删除
from sqlalchemy import create_engine,  MetaData, or_, func, and_
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, session, scoped_session

engine = create_engine('mysql+pymysql://root:199596@localhost/flaskp_boke', echo=False)
DBsession = sessionmaker(bind=engine)
dbsession = scoped_session(DBsession)   # 线程安全
Base = declarative_base()
md = MetaData(bind=engine)

class Users(Base):
    __table__ = Table('users', md, autoload=True) #表名  原数据  自动加载表结构

class Article(Base):
    __table__ = Table('article', md, autoload=True)

class Comment(Base):
    __table__ = Table('comment', md, autoload=True)

【单独功能使用】
query = session.query(Users)
xm_user = query.filter(Users.user_name == '小华').first()
dbsession.delete(xm_user)
dbsession.commit()


【链式使用】
row = dbsession.query(Users).filter_by(userid=9).delete()
dbsession.commit()

3.利用SQLAlchemy执行原生SQL

from sqlalchemy import create_engine,  MetaData,
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, scoped_session

engine = create_engine('mysql+pymysql://root:199596@localhost/flaskp_boke', echo=False)
DBsession = sessionmaker(bind=engine)
dbsession = scoped_session(DBsession)   # 线程安全
Base = declarative_base()
md = MetaData(bind=engine)

# 利用SQLAlchemy执行原生SQL
result = dbsession.execute("select * from users where userid>5").fetchall()
rint(result)
print(result[0].username)

dbsession.execute("delete from users where userid=10")
dbsession.commit()

三,Flask_sqlalchemy

  • 导入方式:from flask_sqlalchemy import SQLAlchemy
  • 安装方式:pip install flask-sqlalchemy + pip install flask-mysqldb
  • 教程直通车:
    【个人博客】https://www.jb51.net/article/250758.htm
    【个人博客】https://www.zhangshengrong.com/p/w4N7D8oGXr/

1.数据库表结构创建(一般不通过代码创建,了解即可)

# coding:utf-8
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

class Config(object):
    """配置参数"""
    # sqlalchemy的配置参数
    SQLALCHEMY_DATABASE_URI = "mysql://root:199596@127.0.0.1:3306/db_python"

    # 设置sqlalchemy自动更跟踪数据库
    SQLALCHEMY_TRACK_MODIFICATIONS = True

app.config.from_object(Config)

# 创建数据库sqlalchemy工具对象
db = SQLAlchemy(app)

class Role(db.Model):
    """用户角色/身份表"""
    __tablename__ = "tbl_roles"

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32), unique=True)
    #设置反向关系,额外为User添加一个role属性(反推属性)
    users = db.relationship("User", backref="role")

    def __repr__(self):
        """定义之后,可以让显示对象的时候更直观"""
        return "Role object: name=%s" % self.name

# 表名的常见规范
# ihome -> ih_user   数据库名缩写_表名
# tbl_user  tbl_表名
# 创建数据库模型类
"""
    常见列选项
    选项名                说明
    primiary_key        如果为True,代表表的主键
    unique              如果为True,代表这列不允许重复
    index               如果为True,为这列创建索引,提高查询效率
    nullable            如果为True,允许有空值,为False,不允许有空值
    default             为这列定义默认值
"""
class User(db.Model):
    """用户表"""
    __tablename__ = "tbl_users"  # 指明数据库的表名

    id = db.Column(db.Integer, primary_key=True)  # 整型的主键,会默认设置为自增主键
    name = db.Column(db.String(64), unique=True)
    email = db.Column(db.String(128), unique=True)
    password = db.Column(db.String(128))
    role_id = db.Column(db.Integer, db.ForeignKey("tbl_roles.id"))

    def __repr__(self):
        return "User object: name=%s" % self.name

if __name__ == '__main__':
    # 清除数据库里的所有数据--第一次创建会有脏数据
    db.drop_all()

    # 创建所有的表
    db.create_all()

    #【单条保存】
    # 创建对象
    role1 = Role(name="admin")
    # session记录对象任务
    db.session.add(role1)
    # 提交任务到数据库中
    db.session.commit()

    role2 = Role(name="stuff")
    db.session.add(role2)
    db.session.commit()

    #【多条保存】
    us1 = User(name='wang', email='wang@163.com', password='123456', role_id=role1.id)
    us2 = User(name='zhang', email='zhang@189.com', password='201512', role_id=role2.id)
    us3 = User(name='chen', email='chen@126.com', password='987654', role_id=role2.id)
    us4 = User(name='zhou', email='zhou@163.com', password='456789', role_id=role1.id)

    # 一次保存多条数据
    db.session.add_all([us1, us2, us3, us4])
    db.session.commit()

2.数据库增删改查

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

# coding:utf-8
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

#创建flask应用对象,当前的模块名字
app = Flask(__name__)

class Config(object):
    """配置参数"""
    # sqlalchemy的配置参数
    SQLALCHEMY_DATABASE_URI = "mysql://root:199596@127.0.0.1:3306/flask_test"

    # 设置sqlalchemy自动更跟踪数据库
    SQLALCHEMY_TRACK_MODIFICATIONS = True


app.config.from_object(Config)

# 创建数据库sqlalchemy工具对象
db = SQLAlchemy(app)

# 创建数据库模型类--角色
class Role(db.Model):
    """用户角色/身份表"""
    __tablename__ = "tbl_roles"

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32), unique=True)
    #设定关联关系
    users = db.relationship("User", backref="role")

    def __repr__(self):
        """定义之后,可以让显示对象的时候更直观,一般不用改"""
        return "Role object: name=%s" % self.name


# 创建数据库模型类--用户
class User(db.Model):
    """用户表"""
    __tablename__ = "tbl_users"  # 指明数据库的表名

    id = db.Column(db.Integer, primary_key=True)  # 整型的主键,会默认设置为自增主键
    name = db.Column(db.String(64), unique=True)
    email = db.Column(db.String(128), unique=True)
    password = db.Column(db.String(128))
    #外键设置格式
    role_id = db.Column(db.Integer, db.ForeignKey("tbl_roles.id"))

    def __repr__(self):
        return "User object: name=%s" % self.name


if __name__ == '__main__':
    # 清除数据库里的所有数据
    db.drop_all()

    # 创建所有的表
    db.create_all()

    """增加数据"""
    #1.创建对象
    role1 = Role(name = "admin")
    #2.session记录对象任务,提交单个数据
    db.session.add(role1)
    #3.提交session任务
    db.session.commit()


    role2 = Role(name = "stuff")
    db.session.add(role2)
    db.session.commit()

    us1 = User(name='wang',email='wang@163.com',pswd='123456',role_id=role1.id)
    us2 = User(name='zhang',email='zhang@189.com',pswd='201512',role_id=role2.id)
    us3 = User(name='chen',email='chen@126.com',pswd='987654',role_id=role2.id)
    us4 = User(name='zhou',email='zhou@163.com',pswd='456789',role_id=role1.id)
    #提交多个存储数据到记录中
    db.session.add_all([us1,us2,us3,us4])
    db.session.commit()

    """删除数据"""
    user = User.query.get(3)
    db.session.delete(user)
    db.session.commit()

    """修改数据"""
    #方法一:
    user = User.query.get(1)
    user.name = "python"
    db.session.add(user)
    db.session.commit()
    #方法二:
    User.query.filter_by(name = "zhou").update({"name":"python","email":"itcast"})
    db.session.commit()


    """查询数据"""
    ###可以将单个数据当做对象来通过属性来提取数据
    #例:查询多条数据并将第一条数据的name值取出
    li = Role.query.all()#flask-sqlalchemy方法
    li2 = db.session.query(Role).all()#原始sqlalchemy方法
    r = li[0]
    temp_name = r.name

    #查询数据库中单条数据,第一条数据
    r = Role.query.first()
    r2 = db.session.query(Role).first()
    temp_name = r.name

    #通过主键值来获取单条数据
    r = Role.query.get(2)
    r2 = db.session.query(Role).get(2)
    temp_name = r.name

##############################################################3
    ###查询过滤器(符合条件取出)
    """
    过滤器 说明
filter()    把过滤器添加到原查询上,返回一个新查询
filter_by() 把等值过滤器添加到原查询上,返回一个新查询
limit   使用指定的值限定原查询返回的结果
offset()    偏移原查询返回的结果,返回一个新查询
order_by()  根据指定条件对原查询结果进行排序,返回一个新查询
group_by()  根据指定条件对原查询结果进行分组,返回一个新查询

all()   以列表形式返回查询的所有结果
first() 返回查询的第一个结果,如果未查到,返回None
first_or_404()  返回查询的第一个结果,如果未查到,返回404
get()   返回指定主键对应的行,如不存在,返回None
get_or_404()    返回指定主键对应的行,如不存在,返回404
count() 返回查询结果的数量
paginate()  返回一个Paginate对象,它包含指定范围内的结果
    """

    #不加后面all等操作的时候为一个不会执行的查询
    #查询不到会返回NoneType
    user1 = User.query.filter_by(name = "wang").all()
    user2 = User.query.filter_by(name = "wang",role_id = 1).first()

    #filter为万能过滤器,filter_by为一个特殊的等值过滤器
    user1 = User.query.filter(User.name == "wang").all()
    user2 = User.query.filter(User.name == "wang",User.role_id == 1).first()

    #引入或者,与,非参数
    from sqlalchemy import or_,and_,not_
    #或操作
    user1 = User.query.filter(or_(User.name == "wang",User.email.endswith("163.com"))).all()
    temp_name = user1[0].name

    #例:取User表中跳过两个数据后取前两个数据
    user = User.query.offset(2).limit(2).all()

    ##排序flask-sqlalchemy写法
    User.query.order_by("-id").all()
    ##排序flask官方写法,asc升序
    User.query.order_by(User.id.desc()).all()

    ##分组查询(需要的时候在查吧,看着好像也没啥用),前面为显示信息
    #如果需要求和操作,from sqlalchemy import func中有好多功能,用的时候再查吧
    db.session.query(User.role_id).group_by(User.role_id)
####################################################################3
    ###关联查询
    #从Role往User中查询
    ro = Role.query.get(1)
    user_name = ro.users[0].name
    #从User往Role中查询
    user = User.query.get(1)
    role_name = user.role.name  #role为关系别名

四,Redis(不做详细讲解,只给出教程直通车+数据库免安装资源)

  • 导入方式:import redis
  • 安装方式:pip install redis
  • 教程直通车
    【个人博客】https://blog.csdn.net/u014651560/article/details/119562421
    【个人博客】https://blog.csdn.net/csdnhxs/article/details/122450575
  • redis数据库免安装包:https://download.csdn.net/download/hot7732788/86403658

五,自定义ORM(使用原生pymysql)–学习构建方法

1.抽出公共功能为基类版本

import pymysql
from pymysql.cursors import DictCursor

class MySQL:
    # 实例化即创建与数据库之间的连接
    def __init__(self):
        conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='199596',
                       charset='utf8', database='flaskp_boke', autocommit=True)
        self.cursor = conn.cursor(DictCursor)

    # 封装基础查询语句
    def query(self, sql):
        self.cursor.execute(sql)
        result = self.cursor.fetchall()
        return result

    # 执行修改操作
    def execute(self, sql):
        try:
            self.cursor.execute(sql)
            return 'OK'
        except:
            return 'Fail'

# 封装成标准的模型类,供子类继承
# 增加field()方法来指定查询哪些列,*代表所有列
class Model:
    def __init__(self, **kwargs):
        for k, v in kwargs.items():
            self.__setattr__(k, v)

    # 通过链式操作指定查询哪些列
    def field(self, columns):
        self.columns = columns  # 动态增加类实例属性
        return self

    # 带列名的查询条件
    def select(self, **where):
        table = self.__class__.__getattribute__(self, 'table_name')

        if hasattr(self, 'columns'):
            sql = "select %s from %s" % (self.columns, table)
        else:
            sql = "select * from %s" % table

        if where is not None:
            sql += " where"
            for k, v in where.items():
                sql += " %s='%s' and" % (k, v)
            sql += ' 1=1'

        result = MySQL().query(sql)
        return result

    # 正常新增数据
    def insert(self):
        keys = []
        values = []
        for k, v in self.__dict__.items():
            keys.append(k)
            values.append(str(v))

        sql = "insert into %s(%s) values('%s')" % (self.table_name, ','.join(keys), "','".join(values))
        result = MySQL().execute(sql)
        print(result)


# 定义子类Users和Article模型类
class Users(Model):
    table_name = 'users'

    # 调用父类的构造方法
    def __init__(self, **kwargs):
        super().__init__(**kwargs)


class Article(Model):
    table_name = 'article'

    # 调用父类的构造方法
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

user = Users()
# result = user.select(userid=1)
result = user.field('userid, username, nickname').select(userid=2)
print(result)

article = Article()
result = article.select(articleid=1)
print(result[0]['headline'])

2.不抽出基类版本

import pymysql
from pymysql.cursors import DictCursor

class MySQL:
    # 实例化即创建与数据库之间的连接
    def __init__(self):
        conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='199596',
                       charset='utf8', database='flaskp_boke', autocommit=True)
        self.cursor = conn.cursor(DictCursor)  #定义返回字典的数据库游标

    # 封装基础查询语句
    def query(self, sql):
        self.cursor.execute(sql)
        result = self.cursor.fetchall()
        return result

    # 执行修改操作
    def execute(self, sql):
        try:
            self.cursor.execute(sql)
            return 'OK'
        except:
            return 'Fail'


class Users:
    table_name = 'users'    # 定义表名

    # 构造方法,传递字典参数作为Insert的Key和Value
    def __init__(self, **kwargs):
        for k, v in kwargs.items():
            self.__setattr__(k, v)  #把表中列名变成了属性,值变成了对应属性值
        print(self.__dict__)

    # 封装查询操作
    def select(self, **where):
        sql = "select * from %s" % self.table_name
        if where is not None:
            sql += " where"
            for k, v in where.items():
                sql += " %s='%s' and" % (k, v)
            sql += ' 1=1'
        print(sql)
        result = MySQL().query(sql)
        return result

    # 封装新增: insert into table(c1, c2, c3) values(v1, v2, v3)
    def insert(self):
        keys = []
        values = []
        for k, v in self.__dict__.items():
            keys.append(k)
            values.append(str(v))

        sql = "insert into %s(%s) values('%s')" % (self.table_name, ','.join(keys), "','".join(values))
        print(sql)
        result = MySQL().execute(sql)
        print(result)


if __name__ == '__main__':
    # user = Users()
    # result = user.select("userid=1 and nickname='蜗牛'")
    # result = user.select(userid=1, nickname='蜗牛')
    # result = user.select(userid=3)
    # print(result)

    user = Users(username='reader4@woniuxy.com', password='e10adc3949ba59abbe56e057f20f883e', role='user', credit=5)
    user.insert()

    print(user.select(username='reader4@woniuxy.com'))
  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
连接数据库代码实例 1,连接数据库代码 文件名称 conn.asp 所有访问数据库的文件都调用此文件<!--#include file=\"Conn.asp\"--> <% db=\"data/data.mdb\" \'数据库存放目录 on error resume next set conn=server.createobject(\"adodb.connection\") conn.open \"driver={microsoft access driver (*.mdb)};dbq=\"&server.mappath(db) if err then err.clear set conn = Nothing response.write \"数据库连接出错,请检conn.asp中的连接字符串。\" response.end end if function CloseDB Conn.Close set Conn=Nothing End Function %> <% dim badword badword=\"\'|and|select|update|chr|delete|%20from|;|insert|mid|master.|set|chr(37)|=\" if request.QueryString<>\"\" then chk=split(badword,\"|\") for each query_name in request.querystring for i=0 to ubound(chk) if instr(lcase(request.querystring(query_name)),chk(i))<>0 then response.write \"<script language=javascript>alert(\'传参错误!参数 \"&query_name&\" 的值中包含非法字符串!\\n\\n\');location=\'\"&request.ServerVariables(\"HTTP_REFERER\")&\"\'</Script>\" response.end end if next next end if %> ---------------------------------------------- 2。增加纪录 <% if request(\"action\")=\"add\" then name=request.form(\"name\") content=request.form(\"content\") set rs=server.createobject(\"adodb.recordset\") sql=\"select * from biao\" rs.open sql,conn,3,2 rs.addnew rs(\"name\")=name if content<>\"\" then rs(\"content\")=content else rs(\"content\")=null end if rs(\"date\")=date() rs.update rs.close set rs=nothing response.write \"<script language=javascript>alert(\'添加成功!\');location.href(\'index.asp\');</script>\" end if %> -------------------------------------- 3.显示记录 <% set rs=server.createobject(\"adodb.recordset\") sql=\"select * from biao order by id desc\" \'sql=\"select top 10 * from biao order by id desc\" rs.open sql,conn,1,1 rs.pagesize=15 \'-------设置每页显示的记录数 dim page page=request(\"page\") if page<>\"\" and IsNumeric(page) then page=clng(page) else page=1 end if n=rs.pagecount if page>n then page=clng(n) end if if rs.eof then response.write\"<font color=#FF0000>暂没有信息!</font>\" \'response.end else rs.absolutepage=page end if i=0 do while not rs.eof and i<rs.pagesize \'do while not rs.eof %> --------如果是每行显示n个纪录开始---------------------------- <% do while not rs.eof and i<rs.pagesize \'do while not rs.eof if i mod 5=0 then \'--------设置每行显示的个数 response.write \"<tr>\" end if %> --------如果是每行显示n个纪录结束----------------------------- <%=rs(\"id\")%> <% rs.movenext i=i+1 loop %> <% response.write(\"共\"&rs.recordcount&\"条信息   \") if page<>1 then response.write(\"<a href=?page=1 title=\'首页\'>首页</a> \") else response.write(\"首页 \") end if if page>1 then response.write(\"<a href=?page=\"&page-1&\" title=\'上一页\'>上一页</a> \") else response.write(\"上一页 \") end if if page<n then response.write(\"<a href=?page=\"&page+1&\" title=\'下一页\'>下一页</a> \") else response.write(\"下一页 \") end if if page<>n then response.write(\"<a href=?page=\"&n&\" title=\'尾页\'>尾页</a> \") else response.write(\"尾页 \") end if response.write(\"   当前页:\"&page&\"/\"&n&\"\") %> 转到:<select name=\"select\" onChange=\'javascript:window.open(this.options[this.selectedIndex].value,\"_top\")\'> <%for p=1 to rs.pagecount%> <option value=\"?page=<%=p%>\" <% if page=p then response.write \"selected\" end if%>>第<%=p%>页</option> <%next%> ---------------------------------------------- 4。更新纪录,删除纪录,删除所有记录 <% if request(\"action\")=\"manage\" then call manage() end if if request(\"action\")=\"edit\" then id=request(\"id\") set rs=server.createobject(\"adodb.recordset\") sql=\"select * from biao where id=\"&id&\"\" rs.open sql,conn,1,1 call edit() end if if request(\"action\")=\"del\" then conn.execute(\"delete * from biao where id=\"&request(\"id\")&\"\") conn.close response.write\"<script language=\'javascript\'>alert(\'删除成功!\');location.href(\'?action=manage\');</script>\" end if if request(\"action\")=\"delall\" then conn.execute(\"delete * from biao\") conn.close response.write\"<script language=\'javascript\'>alert(\'所有信息已成功删除!\');location.href(\'?action=manage\');</script>\" end if if request(\"action\")=\"saveedit\" then name=request.form(\"name\") hits=request.form(\"hits\") content=request.form(\"content\") set rs=server.createobject(\"adodb.recordset\") sql=\"select * from biao where id=\"&request(\"id\")&\"\" rs.open sql,conn,3,2 rs(\"name\")=name rs(\"content\")=content rs(\"hits\")=hits rs.update conn.close set rs=nothing response.write \"<script language=javascript>alert(\'编辑成功!\');location.href(\'?id=\"&request(\"id\")&\"&action=edit\');</script>\" end if %> --------------------------------- 5。询纪录 <form name="form1" method="post" action="search.asp"> <input name="keyword" type="text" id="keyword" size="25"> <select name="select" size="1"> <option value="name" selected>名称</option> <option value="content">说明</option> <option value="id">id</option> </select> <input type="submit" name="Submit" value="询"> </form> ------search.asp--------------- <% if request("keyword")<>"" and request("select")<>"" then sql="select * from biao where "&request("select")&" like '%"&request("keyword")&"%'" elseif request("keyword")<>"" and request("select")="all" then sql="select * from biao where name like '%"&request("keyword")&"%' or id like '%"&request("keyword")&"%' or content like '%"&request("keyword")&"%'" else response.redirect("index.asp") end if set rs=server.createobject("adodb.recordset") rs.open sql,conn,1,1 rs.pagesize=15 '-------设置每页显示的记录数 dim page page=request("page") if page<>"" and IsNumeric(page) then page=clng(page) else page=1 end if n=rs.pagecount if page>n then page=clng(n) end if if rs.eof then response.write"<font color=#FF0000>询的信息不存在或者已经删除!</font>" 'response.end else rs.absolutepage=page end if i=0 do while not rs.eof and i<rs.pagesize 'do while not rs.eof %> <%=rs("id")%> <% rs.movenext i=i+1 loop %> ----------------------------------------- 6.有分类的纪录代码 ---------------显示分类开始--------------------------------- <% set rs=server.createobject("adodb.recordset") sql="select all * from class order by id desc" rs.open sql,conn,1,1 do while not rs.eof %> <a href="class.asp?classname=<%=rs("classname")%>"><b><%=rs("classname")%></b></a> <% rs.movenext i=i+1 loop %> ---------------显示分类结束-------------------------- -------------显示现在所在分类开始------------------- <% set rs=server.createobject("adodb.recordset") sql="select top 1 * from class where classname='"&request("classname")&"'" rs.open sql,conn,1,1 do while not rs.eof %> <%=rs("classname")%> <% rs.movenext i=i+1 loop %> -----------显示现在所在分类结束---------------------- -----------显示此分类的纪录开始------------ <% set rs=server.createobject("adodb.recordset") sql="select * from biao where fenlei='"&request("classname")&"'" rs.open sql,conn,1,1 rs.pagesize=10 '-------设置每页显示的记录数 dim page page=request("page") if page<>"" and IsNumeric(page) then page=clng(page) else page=1 end if n=rs.pagecount if page>n then page=clng(n) end if if rs.bof or rs.eof then response.write"<font color=#ff0000>暂没有任何数据!</font>" 'response.end else rs.absolutepage=page end if i=0 do while not rs.eof and i<rs.pagesize %> <%=rs("id")%> <% rs.movenext i=i+1 loop %> --------------显示此分类的纪录结束---------------- ---------删除所在分类纪录开始------------ <% if request("classname")<>"" then%> <a href="?action=del_fenlei&classname=<%=request("classname")%>" title="删除所有本类信息?" onClick="{if (confirm('您确定要删除所有信息吗?')){return true;}return false;}"><font color=FF0000>清空所有本类信息</font></a> <%end if%> if request("action")="del_fenlei" then classname=request("classname") conn.execute("delete * from biao where fenlei='"&classname&"'") CloseDB response.write"<script language='javascript'>alert('删除本类成功!');location.href('?action=manage');</script>" end if ---------删除所在分类纪录结束-------------------------------- ------------------------------- 7。上传文件或者图片 删除文件代码 (请在同一目录建立文件夹upfile/softpic) 上传文件的页面(调用upsoftpic.asp) <form name="form" method="post" action="?action=add" onsubmit="return chkform(this)"> <input name="picurl" type="text" id="picurl" size="20"> <iframe name="I1" width="155" height="25" src="upsoftpic.asp" scrolling="no" border="0" frameborder="0">浏览器不支持嵌入式框架,或被配置为不显示嵌入式框架。</iframe> </form> upsoftpic.asp <form action="Upfile.asp?action=upsoftpic" method="POST" enctype="multipart/form-data" class="fontmenu2" onsubmit="up.disabled=true;up.value='上传中,请稍候……'"> <input name="softpic" type="file" class="fontmenu2" size="1"> <input type="submit" value="上传" name="up" > </form> upfile.asp <%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%> <%Server.ScriptTimeout=999%> <!--#include file="Conn.asp"--> <!--#include file="Upload.asp" --> <!-- 上传软件或者图片开始 --> <% if request("action")="upsoftpic" then set upload=new upload_5xsoft set file=upload.file("softpic") fileExt=lcase(right(file.filename,4)) if fileEXT<>".jpg" and fileEXT<>".gif" and fileEXT<>".rar" then '---设置上传类型 ++++fileEXT<>".***"++++++++ response.write"<script>alert('格式不对,请重新上传!');location='"&request.ServerVariables("HTTP_REFERER")&"'</script>" response.end end if if file.fileSize>0 then formPath="upfile/softpic" '-------上传路径 'formPath="../upfile/softpic" if right(formPath,1)<>"/" then formPath=formPath&"/" end if vfname = filename(now()) fname = vfname & "." & GetExtendName(file.FileName) file.SaveAs Server.mappath(formPath&fname) ''保存文件 %> <script> parent.form.picurl.value+='upfile/softpic/<%=fname%>' //-上传路径 //parent.frmadd.dreamcontent.value+='[img]upload/<%=ufp%>[/img]' location.replace('Upsoftpic.asp') //---返回文件 </script> <% '------文件名 end if set file=nothing set upload=nothing function filename(fname) fname = now() fname = replace(fname,"-","") fname = replace(fname," ","") fname = replace(fname,":","") fname = replace(fname,"PM","") fname = replace(fname,"AM","") fname = replace(fname,"上午","") fname = replace(fname,"下午","") filename=fname end function function GetExtendName(FileName) dim ExtName ExtName = LCase(FileName) ExtName = right(ExtName,3) ExtName = right(ExtName,3-Instr(ExtName,".")) GetExtendName = ExtName end function end if %> <!-- 上传软件或者图片结束 --> upload.asp <SCRIPT RUNAT=SERVER LANGUAGE=VBSCRIPT> dim Data_5xsoft Class upload_5xsoft dim objForm,objFile,Version Public function Form(strForm) strForm=lcase(strForm) if not objForm.exists(strForm) then Form="" else Form=objForm(strForm) end if end function Public function File(strFile) strFile=lcase(strFile) if not objFile.exists(strFile) then set File=new FileInfo else set File=objFile(strFile) end if end function Private Sub Class_Initialize dim RequestData,sStart,vbCrlf,sInfo,iInfoStart,iInfoEnd,tStream,iStart,theFile dim iFileSize,sFilePath,sFileType,sFormValue,sFileName dim iFindStart,iFindEnd dim iFormStart,iFormEnd,sFormName Version="化境HTTP上传程序 Version 2.0" set objForm=Server.CreateObject("Scripting.Dictionary") set objFile=Server.CreateObject("Scripting.Dictionary") if Request.TotalBytes<1 then Exit Sub set tStream = Server.CreateObject("adodb.stream") set Data_5xsoft = Server.CreateObject("adodb.stream") Data_5xsoft.Type = 1 Data_5xsoft.Mode =3 Data_5xsoft.Open Data_5xsoft.Write Request.BinaryRead(Request.TotalBytes) Data_5xsoft.Position=0 RequestData =Data_5xsoft.Read iFormStart = 1 iFormEnd = LenB(RequestData) vbCrlf = chrB(13) & chrB(10) sStart = MidB(RequestData,1, InStrB(iFormStart,RequestData,vbCrlf)-1) iStart = LenB (sStart) iFormStart=iFormStart+iStart+1 while (iFormStart + 10) < iFormEnd iInfoEnd = InStrB(iFormStart,RequestData,vbCrlf & vbCrlf)+3 tStream.Type = 1 tStream.Mode =3 tStream.Open Data_5xsoft.Position = iFormStart Data_5xsoft.CopyTo tStream,iInfoEnd-iFormStart tStream.Position = 0 tStream.Type = 2 tStream.Charset ="gb2312" sInfo = tStream.ReadText tStream.Close '取得表单项目名称 iFormStart = InStrB(iInfoEnd,RequestData,sStart) iFindStart = InStr(22,sInfo,"name=""",1)+6 iFindEnd = InStr(iFindStart,sInfo,"""",1) sFormName = lcase(Mid (sinfo,iFindStart,iFindEnd-iFindStart)) '如果是文件 if InStr (45,sInfo,"filename=""",1) > 0 then set theFile=new FileInfo '取得文件名 iFindStart = InStr(iFindEnd,sInfo,"filename=""",1)+10 iFindEnd = InStr(iFindStart,sInfo,"""",1) sFileName = Mid (sinfo,iFindStart,iFindEnd-iFindStart) theFile.FileName=getFileName(sFileName) theFile.FilePath=getFilePath(sFileName) '取得文件类型 iFindStart = InStr(iFindEnd,sInfo,"Content-Type: ",1)+14 iFindEnd = InStr(iFindStart,sInfo,vbCr) theFile.FileType =Mid (sinfo,iFindStart,iFindEnd-iFindStart) theFile.FileStart =iInfoEnd theFile.FileSize = iFormStart -iInfoEnd -3 theFile.FormName=sFormName if not objFile.Exists(sFormName) then objFile.add sFormName,theFile end if else '如果是表单项目 tStream.Type =1 tStream.Mode =3 tStream.Open Data_5xsoft.Position = iInfoEnd Data_5xsoft.CopyTo tStream,iFormStart-iInfoEnd-3 tStream.Position = 0 tStream.Type = 2 tStream.Charset ="gb2312" sFormValue = tStream.ReadText tStream.Close if objForm.Exists(sFormName) then objForm(sFormName)=objForm(sFormName)&", "&sFormValue else objForm.Add sFormName,sFormValue end if end if iFormStart=iFormStart+iStart+1 wend RequestData="" set tStream =nothing End Sub Private Sub Class_Terminate if Request.TotalBytes>0 then objForm.RemoveAll objFile.RemoveAll set objForm=nothing set objFile=nothing Data_5xsoft.Close set Data_5xsoft =nothing end if End Sub Private function GetFilePath(FullPath) If FullPath <> "" Then GetFilePath = left(FullPath,InStrRev(FullPath, "")) Else GetFilePath = "" End If End function Private function GetFileName(FullPath) If FullPath <> "" Then GetFileName = mid(FullPath,InStrRev(FullPath, "")+1) Else GetFileName = "" End If End function End Class Class FileInfo dim FormName,FileName,FilePath,FileSize,FileType,FileStart Private Sub Class_Initialize FileName = "" FilePath = "" FileSize = 0 FileStart= 0 FormName = "" FileType = "" End Sub Public function SaveAs(FullPath) dim dr,ErrorChar,i SaveAs=true if trim(fullpath)="" or FileStart=0 or FileName="" or right(fullpath,1)="/" then exit function set dr=CreateObject("Adodb.Stream") dr.Mode=3 dr.Type=1 dr.Open Data_5xsoft.position=FileStart Data_5xsoft.copyto dr,FileSize dr.SaveToFile FullPath,2 dr.Close set dr=nothing SaveAs=false end function End Class </SCRIPT> 删除文件和记录 <% if request("action")="manage" then call manage() end if if request("action")="edit" then id=request("id") set rs=server.createobject("adodb.recordset") sql="select * from biao where id="&id&"" rs.open sql,conn,1,1 call edit() end if if request("action")="del" then set rs=server.createobject("adodb.recordset") sql="select * from biao where id="&request("id")&"" rs.open sql,conn,3,2 set fileobj=server.createobject("scripting.filesystemobject") if fileobj.FileExists(server.mappath(""&rs("picurl"))) then fileobj.DeleteFile server.mappath(""&rs("picurl")) end if rs.delete conn.close response.write"<script language='javascript'>alert('删除成功!');location.href('?action=manage');</script>" end if if request("action")="delall" then set rs=server.createobject("adodb.recordset") sql="select * from biao" rs.open sql,conn,3,2 set fileobj=server.createobject("scripting.filesystemobject") i=0 do while not(rs.bof or rs.eof) and i<rs.recordcount if fileobj.FileExists(server.mappath(""&rs("picurl"))) then'-----------("../" &rs("picurl"))) then fileobj.DeleteFile server.mappath(""&rs("picurl")) end if rs.movenext i=i+1 loop conn.execute("delete * from biao") conn.close response.write"<script language='javascript'>alert('所有已成功删除!');location.href('?action=manage');</script>" end if if request("action")="saveedit" then name=request.form("name") picurl=request.form("picurl") hits=request.form("hits") content=request.form("content") set rs=server.createobject("adodb.recordset") sql="select * from biao where id="&request("id")&"" rs.open sql,conn,3,2 rs("name")=name rs("content")=content rs("picurl")=picurl rs("hits")=hits rs.update conn.close set rs=nothing response.write "<script language=javascript>alert('编辑成功!');location.href('?id="&request("id")&"&action=edit');</script>" end if %> 删除文件 <a title="删除这个?" href="delfile.asp?id=<%=rs("id")%>&struploadfiles=<%=rs("picurl")%>&action=delsoftpic" onClick="{if (confirm('您确定要删除这个吗?')){return true;}return false;}"><font color="#FF0000">删除</font></a> -------------------------------- --*delfile.asp内容*--- <%if request("action")="delsoftpic" then picurl=request.form("picurl") set rs=server.createobject("adodb.recordset") sql="select * from biao where id="&request("id")&"" rs.open sql,conn,3,2 rs("picurl")=null struploadfiles=trim(request.querystring("struploadfiles")) action=trim(request.querystring("action")) dim fso,arruploadfiles,i set fso = createobject("scripting.filesystemobject") fso.deletefile(server.mappath("" & struploadfiles)) set fso = nothing rs.update conn.close set rs=nothing response.write"<script language='javascript'>alert('删除成功!');location.href('edit.asp?id="&request("id")&"&action=edit');</script>" end if %> <a href="javascript:history.back();">[返回] </a> 8。有关ubb ----------ubbcode.asp-------------- <% const ImagePath="images/emot/" function UBBCode(strContent) strContent= FilterJS(strContent) dim re dim po,ii dim reContent Set re=new RegExp re.IgnoreCase =true re.Global=True po=0 ii=0 re.Pattern="[UPLOAD=(gif|jpg|jpeg|bmp|png)](.[^[]*)(gif|jpg|jpeg|bmp)[/UPLOAD]" strContent=re.replace(strContent,"<br><IMG SRC=""pic/$1.gif"" border=0> 此主题相关图片如下:<br><SPAN style='CURSOR: hand'><IMG SRC=""upload/$2$1"" border=0 alt=转动滚轮可缩放图片 按此在新窗口浏览图片 onload=""imgload(this)"" onclick=""window.open(this.src,null,'')"" onmousewheel=""return bbimg(this)""></span>") re.Pattern="[IMG](http|https|ftp)://(.[^[]*)[/IMG]" strContent=re.replace(strContent,"<img src=$1://$2 border=0 style='cursor:hand' alt=转动滚轮可缩放图片;按此在新窗口浏览图片 onload=""imgload(this)"" onclick=""window.open(this.src,null,'')"" onmousewheel=""return bbimg(this)"">") re.Pattern="[DIR=*([0-9]*),*([0-9]*)](.[^[]*)[/DIR]" strContent=re.Replace(strContent,"<object classid=clsid:166B1BCA-3F9C-11CF-8075-444553540000 codebase=http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=7,0,2,0 width=$1 height=$2><param name=src value=$3><embed src=$3 pluginspage=http://www.macromedia.com/shockwave/download/ width=$1 height=$2></embed></object>") re.Pattern="[QT=*([0-9]*),*([0-9]*)](.[^[]*)[/QT]" strContent=re.Replace(strContent,"<embed src=$3 width=$1 height=$2 autoplay=true loop=false controller=true playeveryframe=false cache=false scale=TOFIT bgcolor=#000000 kioskmode=false targetcache=false pluginspage=http://www.apple.com/quicktime/>") re.Pattern="[MP=*([0-9]*),*([0-9]*)](.[^[]*)[/MP]" strContent=re.Replace(strContent,"<object align=middle classid=CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95 class=OBJECT id=MediaPlayer width=$1 height=$2 ><param name=ShowStatusBar value=-1><param name=Filename value=$3><embed type=application/x-oleobject codebase=http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701 flename=mp src=$3 width=$1 height=$2></embed></object>") re.Pattern="[RM=*([0-9]*),*([0-9]*)](.[^[]*)[/RM]" strContent=re.Replace(strContent,"<OBJECT classid=clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA class=OBJECT id=RAOCX width=$1 height=$2><PARAM NAME=SRC VALUE=$3><PARAM NAME=CONSOLE VALUE=Clip1><PARAM NAME=CONTROLS VALUE=imagewindow><PARAM NAME=AUTOSTART VALUE=true></OBJECT><br><OBJECT classid=CLSID:CFCDAA03-8BE4-11CF-B84B-0020AFBBCCFA height=32 id=video2 width=$1><PARAM NAME=SRC VALUE=$3><PARAM NAME=AUTOSTART VALUE=-1><PARAM NAME=CONTROLS VALUE=controlpanel><PARAM NAME=CONSOLE VALUE=Clip1></OBJECT>") re.Pattern="([FLASH])(.[^[]*)([/FLASH])" strContent= re.Replace(strContent,"<a href=""$2"" TARGET=_blank><IMG SRC=" & ImagePath & "swf.gif border=0 alt=点击开新窗口欣赏该FLASH动画! height=16 width=16>[全屏欣赏]</a><br><OBJECT codeBase=http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0 classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000 width=500 height=400><PARAM NAME=movie VALUE=""$2""><PARAM NAME=quality VALUE=high><embed src=""$2"" quality=high pluginspage='http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash' type='application/x-shockwave-flash' width=500 height=400>$2</embed></OBJECT>") re.Pattern="([FLASH=*([0-9]*),*([0-9]*)])(.[^[]*)([/FLASH])" strContent= re.Replace(strContent,"<a href=""$4"" TARGET=_blank><IMG SRC=" & ImagePath & "swf.gif border=0 alt=点击开新窗口欣赏该FLASH动画! height=16 width=16>[全屏欣赏]</a><br><OBJECT codeBase=http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0 classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000 width=$2 height=$3><PARAM NAME=movie VALUE=""$4""><PARAM NAME=quality VALUE=high><embed src=""$4"" quality=high pluginspage='http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash' type='application/x-shockwave-flash' width=$2 height=$3>$4</embed></OBJECT>") re.Pattern="([URL])(.[^[]*)([/URL])" strContent= re.Replace(strContent,"<A HREF=""$2"" TARGET=_blank>$2</A>") re.Pattern="([URL=(.[^[]*)])(.[^[]*)([/URL])" strContent= re.Replace(strContent,"<A HREF=""$2"" TARGET=_blank>$3</A>") re.Pattern="([EMAIL])(S+@.[^[]*)([/EMAIL])" strContent= re.Replace(strContent,"<img align=absmiddle src=" & ImagePath & "email1.gif><A HREF=""mailto:$2"">$2</A>") re.Pattern="([EMAIL=(S+@.[^[]*)])(.[^[]*)([/EMAIL])" strContent= re.Replace(strContent,"<img align=absmiddle src=" & ImagePath & "email1.gif><A HREF=""mailto:$2"" TARGET=_blank>$3</A>") '自动识别网址 're.Pattern = "^((http|https|ftp|rtsp|mms):(//|\\)[A-Za-z0-9./=?%-&_~`@':+!]+)" 'strContent = re.Replace(strContent,"<img align=absmiddle src=pic/url.gif border=0><a target=_blank href=$1>$1</a>") 're.Pattern = "((http|https|ftp|rtsp|mms):(//|\\)[A-Za-z0-9./=?%-&_~`@':+!]+)$" 'strContent = re.Replace(strContent,"<img align=absmiddle src=pic/url.gif border=0><a target=_blank href=$1>$1</a>") 're.Pattern = "([^>=""])((http|https|ftp|rtsp|mms):(//|\\)[A-Za-z0-9./=?%-&_~`@':+!]+)" 'strContent = re.Replace(strContent,"$1<img align=absmiddle src=pic/url.gif border=0><a target=_blank href=$2>$2</a>") '自动识别www等开头的网址 're.Pattern = "([^(http://|http:\)])((www|cn)[.](w)+[.]{1,}(net|com|cn|org|cc)(((/[~]*|\[~]*)(w)+)|[.](w)+)*(((([?](w)+){1}[=]*))*((w)+){1}([&](w)+[=](w)+)*)*)" 'strContent = re.Replace(strContent,"<img align=absmiddle src=pic/url.gif border=0><a target=_blank href=http://$2>$2</a>") '自动识别Email地址,如打开本功能在浏览内容很多的帖子会引起服务器停顿 're.Pattern = "([^(=)])((w)+[@]{1}((w)+[.]){1,3}(w)+)" 'strContent = re.Replace(strContent,"<img align=absmiddle src=pic/url.gif border=0><a target=_blank href=""mailto:$2"">$2</a>") re.Pattern="[em(.[^[]*)]" strContent=re.Replace(strContent,"<img src="&ImagePath&"em$1.gif border=0 align=middle>") re.Pattern="[HTML](.[^[]*)[/HTML]" strContent=re.Replace(strContent,"<table width='100%' border='0' cellspacing='0' cellpadding='6' class=tableborder1><td><b>以下内容为程序代码:</b><br>$1</td></table>") re.Pattern="[code](.[^[]*)[/code]" strContent=re.Replace(strContent,"<table width='100%' border='0' cellspacing='0' cellpadding='6' class=tableborder1><td><b>以下内容为程序代码:</b><br>$1</td></table>") re.Pattern="[color=(.[^[]*)](.[^[]*)[/color]" strContent=re.Replace(strContent,"<font color=$1>$2</font>") re.Pattern="[face=(.[^[]*)](.[^[]*)[/face]" strContent=re.Replace(strContent,"<font face=$1>$2</font>") re.Pattern="[align=(center|left|right)](.*)[/align]" strContent=re.Replace(strContent,"<div align=$1>$2</div>") re.Pattern="[QUOTE](.*)[/QUOTE]" strContent=re.Replace(strContent,"<table style=""width:80%"" cellpadding=5 cellspacing=1 class=tableborder1><TR><TD class=tableborder1>$1</td></tr></table><br>") re.Pattern="[fly](.*)[/fly]" strContent=re.Replace(strContent,"<marquee width=90% behavior=alternate scrollamount=3>$1</marquee>") re.Pattern="[move](.*)[/move]" strContent=re.Replace(strContent,"<MARQUEE scrollamount=3>$1</marquee>") re.Pattern="[GLOW=*([0-9]*),*(#*[a-z0-9]*),*([0-9]*)](.[^[]*)[/GLOW]" strContent=re.Replace(strContent,"<table width=$1 style=""filter:glow(color=$2, strength=$3)"">$4</table>") re.Pattern="[SHADOW=*([0-9]*),*(#*[a-z0-9]*),*([0-9]*)](.[^[]*)[/SHADOW]" strContent=re.Replace(strContent,"<table width=$1 style=""filter:shadow(color=$2, strength=$3)"">$4</table>") re.Pattern="[i](.[^[]*)[/i]" strContent=re.Replace(strContent,"<i>$1</i>") re.Pattern="[u](.[^[]*)([/u])" strContent=re.Replace(strContent,"<u>$1</u>") re.Pattern="[b](.[^[]*)([/b])" strContent=re.Replace(strContent,"<b>$1</b>") re.Pattern="[size=([1-4])](.[^[]*)[/size]" strContent=re.Replace(strContent,"<font size=$1>$2</font>") strContent=replace(strContent,"<I></I>","") set re=Nothing UBBCode=strContent end function Function FilterJS(v) if not isnull(v) then dim t dim re dim reContent Set re=new RegExp re.IgnoreCase =true re.Global=True re.Pattern="(javascript)" t=re.Replace(v,"&#106avascript") re.Pattern="(jscript:)" t=re.Replace(t,"&#106script:") re.Pattern="(js:)" t=re.Replace(t,"&#106s:") 're.Pattern="(value)" 't=re.Replace(t,"&#118alue") re.Pattern="(about:)" t=re.Replace(t,"about&#58") re.Pattern="(file:)" t=re.Replace(t,"file&#58") re.Pattern="(document.cookie)" t=re.Replace(t,"documents&#46cookie") re.Pattern="(vbscript:)" t=re.Replace(t,"&#118bscript:") re.Pattern="(vbs:)" t=re.Replace(t,"&#118bs:") re.Pattern="(on(mouse|exit|error|click|key))" t=re.Replace(t,"&#111n$2") 're.Pattern="(&#)" 't=re.Replace(t,"&#") FilterJS=t set re=nothing end if End Function function HTMLEncode(fString) if not isnull(fString) then fString = replace(fString, ">", ">") fString = replace(fString, "<", "<") fString = Replace(fString, CHR(32), " ") fString = Replace(fString, CHR(9), " ") fString = Replace(fString, CHR(34), """) fString = Replace(fString, CHR(39), "'") fString = Replace(fString, CHR(13), "") fString = Replace(fString, CHR(10) & CHR(10), "</P><P> ") fString = Replace(fString, CHR(10), "<BR> ") HTMLEncode = fString end if end function function nohtml(str) dim re Set re=new RegExp re.IgnoreCase =true re.Global=True re.Pattern="(<.[^<]*>)" str=re.replace(str," ") re.Pattern="(</[^<]*>)" str=re.replace(str," ") nohtml=str set re=nothing end function function cutStr(str,strlen) dim l,t,c l=len(str) t=0 for i=1 to l c=Abs(Asc(Mid(str,i,1))) if c>255 then t=t+2 else t=t+1 end if if t>=strlen then cutStr=left(str,i)&".." exit for else cutStr=str end if next cutStr=replace(cutStr,chr(10),"") end function %> '----------ubbcode.asp结束----------------------------- <%=left(rs("name"),6)%> <%=ubbcode(rs("content"))%> <%=Server.HTMLEncode(rs("content"))%> ----------------------字符截取开始------------------------------- <% if len(rs("name"))>10 then response.write "<a href=view.asp?id="&rs("id")&" title='文章标题:"&rs("name")&_ vbcrlf&"阅读次数:"&rs("hits")&vbcrlf&"发表时间:"&rs("date")&"'>"&left(rs("name"),10)&"..</a>" else response.write "<a href=view.asp?id="&rs("id")&" title='文章标题:"&rs("name")&_ vbcrlf&"阅读次数:"&rs("hits")&vbcrlf&"发表时间:"&rs("date")&"'>"&rs("name")&"</a>" end if %> ----------------------字符截取结束--------------------------------- 9。有关后台登陆 chk.asp <% if session("admin")="" then response.redirect"index.asp" end if %> md5.asp <% Private Const BITS_TO_A_BYTE = 8 Private Const BYTES_TO_A_WORD = 4 Private Const BITS_TO_A_WORD = 32 Private m_lOnBits(30) Private m_l2Power(30) Private Function LShift(lValue, iShiftBits) If iShiftBits = 0 Then LShift = lValue Exit Function ElseIf iShiftBits = 31 Then If lValue And 1 Then LShift = &H80000000 Else LShift = 0 End If Exit Function ElseIf iShiftBits < 0 Or iShiftBits > 31 Then Err.Raise 6 End If If (lValue And m_l2Power(31 - iShiftBits)) Then LShift = ((lValue And m_lOnBits(31 - (iShiftBits + 1))) * m_l2Power(iShiftBits)) Or &H80000000 Else LShift = ((lValue And m_lOnBits(31 - iShiftBits)) * m_l2Power(iShiftBits)) End If End Function Private Function RShift(lValue, iShiftBits) If iShiftBits = 0 Then RShift = lValue Exit Function ElseIf iShiftBits = 31 Then If lValue And &H80000000 Then RShift = 1 Else RShift = 0 End If Exit Function ElseIf iShiftBits < 0 Or iShiftBits > 31 Then Err.Raise 6 End If RShift = (lValue And &H7FFFFFFE) m_l2Power(iShiftBits) If (lValue And &H80000000) Then RShift = (RShift Or (&H40000000 m_l2Power(iShiftBits - 1))) End If End Function Private Function RotateLeft(lValue, iShiftBits) RotateLeft = LShift(lValue, iShiftBits) Or RShift(lValue, (32 - iShiftBits)) End Function Private Function AddUnsigned(lX, lY) Dim lX4 Dim lY4 Dim lX8 Dim lY8 Dim lResult lX8 = lX And &H80000000 lY8 = lY And &H80000000 lX4 = lX And &H40000000 lY4 = lY And &H40000000 lResult = (lX And &H3FFFFFFF) + (lY And &H3FFFFFFF) If lX4 And lY4 Then lResult = lResult Xor &H80000000 Xor lX8 Xor lY8 ElseIf lX4 Or lY4 Then If lResult And &H40000000 Then lResult = lResult Xor &HC0000000 Xor lX8 Xor lY8 Else lResult = lResult Xor &H40000000 Xor lX8 Xor lY8 End If Else lResult = lResult Xor lX8 Xor lY8 End If AddUnsigned = lResult End Function Private Function md5_F(x, y, z) md5_F = (x And y) Or ((Not x) And z) End Function Private Function md5_G(x, y, z) md5_G = (x And z) Or (y And (Not z)) End Function Private Function md5_H(x, y, z) md5_H = (x Xor y Xor z) End Function Private Function md5_I(x, y, z) md5_I = (y Xor (x Or (Not z))) End Function Private Sub md5_FF(a, b, c, d, x, s, ac) a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_F(b, c, d), x), ac)) a = RotateLeft(a, s) a = AddUnsigned(a, b) End Sub Private Sub md5_GG(a, b, c, d, x, s, ac) a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_G(b, c, d), x), ac)) a = RotateLeft(a, s) a = AddUnsigned(a, b) End Sub Private Sub md5_HH(a, b, c, d, x, s, ac) a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_H(b, c, d), x), ac)) a = RotateLeft(a, s) a = AddUnsigned(a, b) End Sub Private Sub md5_II(a, b, c, d, x, s, ac) a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_I(b, c, d), x), ac)) a = RotateLeft(a, s) a = AddUnsigned(a, b) End Sub Private Function ConvertToWordArray(sMessage) Dim lMessageLength Dim lNumberOfWords Dim lWordArray() Dim lBytePosition Dim lByteCount Dim lWordCount Const MODULUS_BITS = 512 Const CONGRUENT_BITS = 448 lMessageLength = Len(sMessage) lNumberOfWords = (((lMessageLength + ((MODULUS_BITS - CONGRUENT_BITS) BITS_TO_A_BYTE)) (MODULUS_BITS BITS_TO_A_BYTE)) + 1) * (MODULUS_BITS BITS_TO_A_WORD) ReDim lWordArray(lNumberOfWords - 1) lBytePosition = 0 lByteCount = 0 Do Until lByteCount >= lMessageLength lWordCount = lByteCount BYTES_TO_A_WORD lBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE lWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(Asc(Mid(sMessage, lByteCount + 1, 1)), lBytePosition) lByteCount = lByteCount + 1 Loop lWordCount = lByteCount BYTES_TO_A_WORD lBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE lWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(&H80, lBytePosition) lWordArray(lNumberOfWords - 2) = LShift(lMessageLength, 3) lWordArray(lNumberOfWords - 1) = RShift(lMessageLength, 29) ConvertToWordArray = lWordArray End Function Private Function WordToHex(lValue) Dim lByte Dim lCount For lCount = 0 To 3 lByte = RShift(lValue, lCount * BITS_TO_A_BYTE) And m_lOnBits(BITS_TO_A_BYTE - 1) WordToHex = WordToHex & Right("0" & Hex(lByte), 2) Next End Function Public Function MD5(sMessage) m_lOnBits(0) = CLng(1) m_lOnBits(1) = CLng(3) m_lOnBits(2) = CLng(7) m_lOnBits(3) = CLng(15) m_lOnBits(4) = CLng(31) m_lOnBits(5) = CLng(63) m_lOnBits(6) = CLng(127) m_lOnBits(7) = CLng(255) m_lOnBits(8) = CLng(511) m_lOnBits(9) = CLng(1023) m_lOnBits(10) = CLng(2047) m_lOnBits(11) = CLng(4095) m_lOnBits(12) = CLng(8191) m_lOnBits(13) = CLng(16383) m_lOnBits(14) = CLng(32767) m_lOnBits(15) = CLng(65535) m_lOnBits(16) = CLng(131071) m_lOnBits(17) = CLng(262143) m_lOnBits(18) = CLng(524287) m_lOnBits(19) = CLng(1048575) m_lOnBits(20) = CLng(2097151) m_lOnBits(21) = CLng(4194303) m_lOnBits(22) = CLng(8388607) m_lOnBits(23) = CLng(16777215) m_lOnBits(24) = CLng(33554431) m_lOnBits(25) = CLng(67108863) m_lOnBits(26) = CLng(134217727) m_lOnBits(27) = CLng(268435455) m_lOnBits(28) = CLng(536870911) m_lOnBits(29) = CLng(1073741823) m_lOnBits(30) = CLng(2147483647) m_l2Power(0) = CLng(1) m_l2Power(1) = CLng(2) m_l2Power(2) = CLng(4) m_l2Power(3) = CLng(8) m_l2Power(4) = CLng(16) m_l2Power(5) = CLng(32) m_l2Power(6) = CLng(64) m_l2Power(7) = CLng(128) m_l2Power(8) = CLng(256) m_l2Power(9) = CLng(512) m_l2Power(10) = CLng(1024) m_l2Power(11) = CLng(2048) m_l2Power(12) = CLng(4096) m_l2Power(13) = CLng(8192) m_l2Power(14) = CLng(16384) m_l2Power(15) = CLng(32768) m_l2Power(16) = CLng(65536) m_l2Power(17) = CLng(131072) m_l2Power(18) = CLng(262144) m_l2Power(19) = CLng(524288) m_l2Power(20) = CLng(1048576) m_l2Power(21) = CLng(2097152) m_l2Power(22) = CLng(4194304) m_l2Power(23) = CLng(8388608) m_l2Power(24) = CLng(16777216) m_l2Power(25) = CLng(33554432) m_l2Power(26) = CLng(67108864) m_l2Power(27) = CLng(134217728) m_l2Power(28) = CLng(268435456) m_l2Power(29) = CLng(536870912) m_l2Power(30) = CLng(1073741824) Dim x Dim k Dim AA Dim BB Dim CC Dim DD Dim a Dim b Dim c Dim d Const S11 = 7 Const S12 = 12 Const S13 = 17 Const S14 = 22 Const S21 = 5 Const S22 = 9 Const S23 = 14 Const S24 = 20 Const S31 = 4 Const S32 = 11 Const S33 = 16 Const S34 = 23 Const S41 = 6 Const S42 = 10 Const S43 = 15 Const S44 = 21 x = ConvertToWordArray(sMessage) a = &H67452301 b = &HEFCDAB89 c = &H98BADCFE d = &H10325476 For k = 0 To UBound(x) Step 16 AA = a BB = b CC = c DD = d md5_FF a, b, c, d, x(k + 0), S11, &HD76AA478 md5_FF d, a, b, c, x(k + 1), S12, &HE8C7B756 md5_FF c, d, a, b, x(k + 2), S13, &H242070DB md5_FF b, c, d, a, x(k + 3), S14, &HC1BDCEEE md5_FF a, b, c, d, x(k + 4), S11, &HF57C0FAF md5_FF d, a, b, c, x(k + 5), S12, &H4787C62A md5_FF c, d, a, b, x(k + 6), S13, &HA8304613 md5_FF b, c, d, a, x(k + 7), S14, &HFD469501 md5_FF a, b, c, d, x(k + 8), S11, &H698098D8 md5_FF d, a, b, c, x(k + 9), S12, &H8B44F7AF md5_FF c, d, a, b, x(k + 10), S13, &HFFFF5BB1 md5_FF b, c, d, a, x(k + 11), S14, &H895CD7BE md5_FF a, b, c, d, x(k + 12), S11, &H6B901122 md5_FF d, a, b, c, x(k + 13), S12, &HFD987193 md5_FF c, d, a, b, x(k + 14), S13, &HA679438E md5_FF b, c, d, a, x(k + 15), S14, &H49B40821 md5_GG a, b, c, d, x(k + 1), S21, &HF61E2562 md5_GG d, a, b, c, x(k + 6), S22, &HC040B340 md5_GG c, d, a, b, x(k + 11), S23, &H265E5A51 md5_GG b, c, d, a, x(k + 0), S24, &HE9B6C7AA md5_GG a, b, c, d, x(k + 5), S21, &HD62F105D md5_GG d, a, b, c, x(k + 10), S22, &H2441453 md5_GG c, d, a, b, x(k + 15), S23, &HD8A1E681 md5_GG b, c, d, a, x(k + 4), S24, &HE7D3FBC8 md5_GG a, b, c, d, x(k + 9), S21, &H21E1CDE6 md5_GG d, a, b, c, x(k + 14), S22, &HC33707D6 md5_GG c, d, a, b, x(k + 3), S23, &HF4D50D87 md5_GG b, c, d, a, x(k + 8), S24, &H455A14ED md5_GG a, b, c, d, x(k + 13), S21, &HA9E3E905 md5_GG d, a, b, c, x(k + 2), S22, &HFCEFA3F8 md5_GG c, d, a, b, x(k + 7), S23, &H676F02D9 md5_GG b, c, d, a, x(k + 12), S24, &H8D2A4C8A md5_HH a, b, c, d, x(k + 5), S31, &HFFFA3942 md5_HH d, a, b, c, x(k + 8), S32, &H8771F681 md5_HH c, d, a, b, x(k + 11), S33, &H6D9D6122 md5_HH b, c, d, a, x(k + 14), S34, &HFDE5380C md5_HH a, b, c, d, x(k + 1), S31, &HA4BEEA44 md5_HH d, a, b, c, x(k + 4), S32, &H4BDECFA9 md5_HH c, d, a, b, x(k + 7), S33, &HF6BB4B60 md5_HH b, c, d, a, x(k + 10), S34, &HBEBFBC70 md5_HH a, b, c, d, x(k + 13), S31, &H289B7EC6 md5_HH d, a, b, c, x(k + 0), S32, &HEAA127FA md5_HH c, d, a, b, x(k + 3), S33, &HD4EF3085 md5_HH b, c, d, a, x(k + 6), S34, &H4881D05 md5_HH a, b, c, d, x(k + 9), S31, &HD9D4D039 md5_HH d, a, b, c, x(k + 12), S32, &HE6DB99E5 md5_HH c, d, a, b, x(k + 15), S33, &H1FA27CF8 md5_HH b, c, d, a, x(k + 2), S34, &HC4AC5665 md5_II a, b, c, d, x(k + 0), S41, &HF4292244 md5_II d, a, b, c, x(k + 7), S42, &H432AFF97 md5_II c, d, a, b, x(k + 14), S43, &HAB9423A7 md5_II b, c, d, a, x(k + 5), S44, &HFC93A039 md5_II a, b, c, d, x(k + 12), S41, &H655B59C3 md5_II d, a, b, c, x(k + 3), S42, &H8F0CCC92 md5_II c, d, a, b, x(k + 10), S43, &HFFEFF47D md5_II b, c, d, a, x(k + 1), S44, &H85845DD1 md5_II a, b, c, d, x(k + 8), S41, &H6FA87E4F md5_II d, a, b, c, x(k + 15), S42, &HFE2CE6E0 md5_II c, d, a, b, x(k + 6), S43, &HA3014314 md5_II b, c, d, a, x(k + 13), S44, &H4E0811A1 md5_II a, b, c, d, x(k + 4), S41, &HF7537E82 md5_II d, a, b, c, x(k + 11), S42, &HBD3AF235 md5_II c, d, a, b, x(k + 2), S43, &H2AD7D2BB md5_II b, c, d, a, x(k + 9), S44, &HEB86D391 a = AddUnsigned(a, AA) b = AddUnsigned(b, BB) c = AddUnsigned(c, CC) d = AddUnsigned(d, DD) Next 'MD5 = LCase(WordToHex(a) & WordToHex(b) & WordToHex(c) & WordToHex(d)) MD5=LCase(WordToHex(b) & WordToHex(c)) 'I crop this to fit 16byte database password :D End Function %> index.asp(登陆页面) <form method="post" action="Log.asp?action=login" onsubmit="return chklogin(this)"> <input name="admin" type="text" id="admin"> <input name="pwd" type="text" id="pwd"> <input type="submit" name="Submit" value="登陆"> </form> log.asp <!--#include file="conn.asp"--> <!--#include file="Md5.asp"--> <% Session.TimeOut=30 if request("action")="login" then admin=trim(request.form("admin")) for i=1 to len(admin) '用MID函数读出变量admin中i 位置的一个字符 manage=mid(admin,i,1) if manage="'" or manage="%" or manage="<" or manage=">" or manage="&" then '如果admin中含有' % < > &字符就转到出错页面 response.redirect "Error.asp" response.end end if next pwd=trim(request.form("pwd")) for i=1 to len(pwd) '用MID函数读出变量pwd中i 位置的一个字符 pass=mid(pwd,i,1) if pass="'" or pass="%" or pass="<" or pass=">" or pass="&" then '如果pass中含有' % < > &字符就转到出错页面 response.redirect "Error.asp" response.end end if next pwd=md5(pwd) if admin="" or pwd="" then Response.Redirect ("Index.asp") end if set rs=server.createobject("adodb.recordset") sql="select * from admin where admin='"&admin&"'and pwd='"&pwd&"'" rs.open sql,conn,1,1 if not rs.eof then session("admin")=admin response.redirect"main.asp" else response.redirect"Error.asp" response.end end if end if if request("action")="logout" then session("admin")="" response.redirect"../index.asp" end if %> error.asp <meta http-equiv="refresh" content="3;URL=index.asp"> 登陆出错,三秒钟自动返回 其它想加密的页面调用chk.asp <!--#include file="chk.asp"--> pwd.asp修密码 <% if request("action")="edit" then admin=trim(request.form("admin")) pwd=md5(trim(request.form("pwd"))) set rs=server.createobject("adodb.recordset") sql="select * from admin" rs.open sql,conn,3,2 rs("admin")=admin rs("pwd")=pwd rs.update set rs=nothing set conn=nothing response.write"<script language='javascript'>alert('修成功!');location.href('Admin_Admin.asp');</script>" end if set rs=server.createobject("adodb.recordset") sql="select * from admin" rs.open sql,conn,1,1 %> ------------------------ <form method="POST" action="?action=edit"> <input name="admin" type="text" class="fontmenu2" value="<%=rs("admin")%>" size="20"> <input name="pwd" type="password" class="fontmenu2" value="<%=rs("pwd")%>" size="20"> </form> info.asp(读取服务器基本参数) <!--#include file="chk.asp"--> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>无标题文档</title> </head> <body><table width="100%" border="0" cellpadding=0 cellspacing=1 class="k1" style="border-collapse: collapse"> <tr align="center" bgcolor="#eeeeee" class="fontmenu2"> <td height=25 colspan="2"><font color="#FF0000">恭喜:你已成功登陆后台管理!</font></td> </tr> <tr bgcolor="#eeeeee" class="fontmenu2"> <td width="24%" height=25> 服务器名:</td> <td width='76%'> <%=Request.ServerVariables("SERVER_NAME")%></td> </tr> <tr bgcolor="#eeeeee" class="fontmenu2"> <td height=25> 服务器IP:</td> <td> <%=Request.ServerVariables("LOCAL_ADDR")%></td> </tr> <tr bgcolor="#eeeeee" class="fontmenu2"> <td height=25> 服务器端口:</td> <td> <%=Request.ServerVariables("SERVER_PORT")%></td> </tr> <tr bgcolor="#eeeeee" class="fontmenu2"> <td height=25> 服务器时间:</td> <td> <%=now%></td> </tr> <tr bgcolor="#eeeeee" class="fontmenu2"> <td height=25> IIS版本:</td> <td> <%=Request.ServerVariables("SERVER_SOFTWARE")%></td> </tr> <tr bgcolor="#eeeeee" class="fontmenu2"> <td height=25> 服务器操作系统:</td> <td> <%=Request.ServerVariables("OS")%></td> </tr> <tr bgcolor="#eeeeee" class="fontmenu2"> <td height=25> 脚本超时时间:</td> <td> <%=Server.ScriptTimeout%> 秒</td> </tr> <tr bgcolor="#eeeeee" class="fontmenu2"> <td height=25> 站点物理路径:</td> <td> <%=request.ServerVariables("APPL_PHYSICAL_PATH")%></td> </tr> <tr bgcolor="#eeeeee" class="fontmenu2"> <td height=25> 服务器CPU数量:</td> <td> <%=Request.ServerVariables("NUMBER_OF_PROCESSORS")%> 个</td> </tr> <tr bgcolor="#eeeeee" class="fontmenu2"> <td height=25> 服务器解译引擎:</td> <td> <%=ScriptEngine & "/"& ScriptEngineMajorVersion &"."&ScriptEngineMinorVersion&"."& ScriptEngineBuildVersion %></td> </tr> <tr bgcolor="#eeeeee" class="fontmenu2"> <td height=25> 本文件路径:</td> <td> <%=Request.ServerVariables("PATH_TRANSLATED")%></td> </tr> </table> <!--#include file="food.asp"--> </body> </html>
首先需要安装Flask和对应的数据库驱动,比如MySQL或者SQLite等。以MySQL为例,可以使用pymysql库来连接数据库。 在Flask中,可以使用Flask-SQLAlchemy来简化数据库操作。下面是一个示例代码,实现了对用户信息的增删操作: ```python from flask import Flask, request from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) # 配置数据库连接信息 app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:password@localhost:3306/database_name' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app) # 定义用户模型 class User(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50)) age = db.Column(db.Integer) def __repr__(self): return f'<User {self.id}: {self.name}, {self.age}>' # 添加用户 @app.route('/users', methods=['POST']) def add_user(): data = request.get_json() user = User(name=data['name'], age=data['age']) db.session.add(user) db.session.commit() return {'message': 'User added successfully'} # 询所有用户 @app.route('/users', methods=['GET']) def get_all_users(): users = User.query.all() return {'users': [user.__dict__ for user in users]} # 询单个用户 @app.route('/users/<int:user_id>', methods=['GET']) def get_user(user_id): user = User.query.filter_by(id=user_id).first() if user: return user.__dict__ else: return {'message': 'User not found'} # 更新用户信息 @app.route('/users/<int:user_id>', methods=['PUT']) def update_user(user_id): user = User.query.filter_by(id=user_id).first() if user: data = request.get_json() user.name = data['name'] user.age = data['age'] db.session.commit() return {'message': 'User updated successfully'} else: return {'message': 'User not found'} # 删除用户 @app.route('/users/<int:user_id>', methods=['DELETE']) def delete_user(user_id): user = User.query.filter_by(id=user_id).first() if user: db.session.delete(user) db.session.commit() return {'message': 'User deleted successfully'} else: return {'message': 'User not found'} if __name__ == '__main__': app.run() ``` 注意,在实际开发中需要对数据库连接进行安全处理,比如使用配置文件来存储敏感信息,以避免密码泄露等安全问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值