Python/通过ORM框架-SQLAIchemy结合socket通过浏览器读取数据库

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39591494/article/details/89947846

SQLAIchemy.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2019/5/2 18:26
# @Author  : YanZanG
# @File    : SQLAIchemy
# @Function: -----------

# 创建2个数据表,作者表authors和文章表articles

import time
import json
from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy.ext.declarative import declarative_base

Yankerp_tables = declarative_base()
date = time.strftime('%Y-%m-%d %H:%S', time.localtime(time.time()))


class Authors(Yankerp_tables):
    """这是一个作者信息的表
    """
    __tablename__ = "authors"

    id = Column('id', Integer, primary_key=True)
    name = Column('name', String(50), unique=True)
    city = Column('city', String(20))

    def __repr__(self):
        return self.name


class Articles(Yankerp_tables):
    """这是一个文章信息的表
    """
    __tablename__ = "articles"

    id = Column('id', Integer, primary_key=True)
    title = Column('title', String(20), unique=True, nullable=False)
    content = Column('content', String(180), nullable=False)
    comment = Column('comment', String(50))
    time_cost = Column('time_cost', String(50))
    
    # 取外键authors.id过来到Articles
    author_id = Column(Integer, ForeignKey("authors.id"))

    # 创建有关系的一句话
    authors = relationship("Authors", back_populates="articles_s")

    def __repr__(self):
        return self.title


def create_tables(user, password, address, port, database):
    """创建表的操作
    """
    # 让作者信息表里面的articles_s有值,一对多
    try:
        Authors.articles_s = relationship("Articles", back_populates="authors", order_by=Articles.id)
        engine = create_engine(f'mysql+pymysql://{user}:{password}@{address}:{port}/{database}?charset=utf8')
        Yankerp_tables.metadata.create_all(bind=engine) # 创建表操作

        DBSession = sessionmaker(bind=engine)
        session = DBSession()
        return session
    except Exception as e:
        print(e)
        return False


def data_info():
    """添加数据信息认证
    """
    address = input("请您输入数据库地址:".strip())
    user = input("请您输入数据库用户名:".strip())
    password = input("请您输入数据库密码:".strip())
    port = input("请您输入数据库端口:".strip())
    database = input("请您输入需要连接的数据库名:".strip())

    session_data = create_tables(user, password, address, port, database)
    if session_data:
        print(f"创建表成功,请您在{database}库中查看,添加博主信息开始写文章吧~".center(60, "-"))
        return session_data
    else:
        return False


def add_articles():
    title = input("请您输入文章标题:".strip())
    content = input("请您输入文章内容:".strip())
    comment = input("请您输入描述信息:".strip())

    return title, content, comment


def add_author():
    """添加作者信息
    """
    add_session = data_info()
    if add_session:
        author_name = input("请您输入您的博客名称:".strip())
        author_city = input("请您输入您所在的城市:".strip())

        if author_name and author_city:
            Auth = Authors(name=author_name, city=author_city)
            add_session.add(Auth)
            add_session.commit()

            us1 = add_session.query(Authors).filter(Authors.name == author_name).all()[0]
            title, content, comment = add_articles()
            us1.articles_s = [
                Articles(title=title, content=content, comment=comment, time_cost=date)
            ]
            add_session.add(us1)
            add_session.commit()
    else:
        return False

add_author()

在这里插入图片描述在这里插入图片描述Admin_memu.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# web_sserver

import socket
import os
import json
import redis
import logger
from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy.ext.declarative import declarative_base

sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Yankerp_tables = declarative_base()  #  declarative_base元类
engine = create_engine(f'mysql+pymysql://root:111111@localhost:3306/yankerp?charset=utf8')
DBSession = sessionmaker(bind=engine)
session = DBSession()

address = ''
port = 8888
addr_list = (address, port)
sk.bind(addr_list)
sk.listen(1)

log = logger.yankerp()


class Authors(Yankerp_tables):
    """这是一个作者信息的表
    """
    __tablename__ = "authors"

    id = Column('id', Integer, primary_key=True)
    name = Column('name', String(50), unique=True)  #  unique不能重复
    city = Column('city', String(20))

    def __repr__(self):
        return self.name


class Articles(Yankerp_tables):
    """这是一个文章信息的表
    """
    __tablename__ = "articles"

    id = Column('id', Integer, primary_key=True)
    title = Column('title', String(20), unique=True, nullable=False)  #  unique不能重复
    content = Column('content', String(180), nullable=False)
    comment = Column('comment', String(50))
    time_cost = Column('time_cost', String(50))
    
    # 取外键authors.id过来到Articles
    author_id = Column(Integer, ForeignKey("authors.id"))

    # 创建有关系的一句话
    authors = relationship("Authors", back_populates="articles_s")

    def __repr__(self):
        return self.title

Authors.articles_s = relationship("Articles", back_populates="authors", order_by=Articles.id)


class Response:
    def __init__(self):
        self.client = redis.StrictRedis(host='localhost', port=6379)

    def web_error(self):
        error = """HTTP/1.1 200 ok

        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
        <html xmlns="http://www.w3.org/1999/xhtml" >
        <head>
        <title>Yankerp</title>
        </head>
        <body>
        <div align="center">
        <form action="" name="myform">
        <table>
        <tr>
        <td>username:</td>
        <td><input type="text" id="user" /></td>
        </tr>
        <tr>
        <td>password:</td>
        <td><input type="text" id="password" /></td>
        </tr>
        <tr>
        <td>Verification code:</td>
        <td align="left"><input type="text" size="5" id="code" /></td>
        </tr>
        </table>
        </form>
        <table>
        <tr>
        <td>
        <input type="submit" value="submit" οnclick=myfun_submit() />
        </td>
        <td>
        <input type="submit" value="Reset" οnclick=myfun_reset() />
        </td>
        </tr>
        </table>
        </div>
        <script type="text/javascript">
        function myfun_submit(){
        var user_val = document.getElementById("user").value;
        var password_val = document.getElementById("password").value;
        if(user_val==""){
        alert("用户名不能为空!!");
        }else if(password_val==""){
        alert("密码不能为空!!!");
        }
        }
        function myfun_reset(){
        document.getElementById("user").value = "";
        document.getElementById("password").value = "";
        document.getElementById("code").value = "";
        }
        </script>
        </body>
        </html>
        
                <!doctype html>
        <html>
        <head>
            <title>滚动文字</title>
        </head>
            
        <body>
        <marquee  direction="right"  behavior="alternate"  scrollamount="15"  scrolldelay="10"  loop="2"    height="100"  bgcolor="ABCDEF" >
            <font  face="隶书"  color="#0066FF"  size="5">欢迎来到后台数据查询系统</font>
        </marquee>
        <marquee  direction="left"  behavior="scroll"  scrollamount="25"  loop="1"  bgcolor="pink"  hspace="90"   vspace="50">
            <font  face="隶书"  color="red"  size="5">对不起,服务器响应失败,您可以访问http://IP/您的博客名称,重试...</font>
        </marquee>
        </body>
        </html>
        
        """.encode('GBK')
        return error

    def search(self, user_name):
        data = session.query(Authors).filter(Authors.name == user_name).all()
        num = {}

        if data:
            for i in data:
                result = i.articles_s[0]
                num["标题:"] = result.title
                num["内容:"] = result.content
                num["时间:"] = result.time_cost

                # result_data = (f'HTTP/1.1 200 ok\n\n str({num})\n').encode()
                result_data = (f"HTTP/1.1 200 ok \n\n" + json.dumps(num) + '\n').encode()
                return result_data
        elif user_name == "all":
            data = session.query(Articles.title).all()
            data_title = {}
            name = []
            name.append(data)
            data_title["all_data"] = name
            result_data_all = (f"HTTP/1.1 200 ok \n\n" + json.dumps(data_title) + '\n').encode()
            return result_data_all
        else:
            return self.web_error()

    def app(self):
        while True:
            try:
                log.debug("服务端正在等待客户端链接".center(60, "-"))

                sock, addr = sk.accept()
                log.debug(f"链接客户端:{addr}成功")

                client_data = sock.recv(1024)
                if client_data:
                    result_data = client_data.decode().splitlines()[0]
                    method, path, http = result_data.split()
                    result = path.strip('/')
                    result_url = client_data.decode().splitlines()[1].strip("Host: ") + '/' + result

                    sock.sendall(self.search(result))
                    self.count_access(result, result_url)
                    self.query_url(result, result_url)
            except Exception as e:
                print(e)

    def count_access(self, user, url):
        try:
            self.client.incr(user + ":" + url)
        except Exception as e:
            print(e)
    
    def query_url(self, user, url):
        try:
            count = self.client.get(user + ":" + url)
            log.debug(f"{user}用户访问地址:{url}页面一共{int(count)}次...........")
        except Exception as e:
            print(e)
    
    def claer_data(self):
        log.debug("redis数据数据记录清除成功")
        self.client.flushall()


def main():
    A = Response()
    A.app()
    # A.claer_data()

if __name__ == "__main__":
    main()

在这里插入图片描述输入数据库博主名称,返回博客文章信息:
在这里插入图片描述持续刷新,通过redis记录访问次数,并存入log

2019-05-08 11:18:27,923 Admin_memu.py [line:175] Admin_Minitoutiao.log DEBUG 链接客户端:('127.0.0.1', 54738)成功
2019-05-08 11:18:27,928 Admin_memu.py [line:199] Admin_Minitoutiao.log DEBUG yankerp用户访问地址:localhost:8888/yankerp页面一共6...........
2019-05-08 11:18:27,928 Admin_memu.py [line:172] Admin_Minitoutiao.log DEBUG ------------------------服务端正在等待客户端链接------------------------
2019-05-08 11:18:28,801 Admin_memu.py [line:175] Admin_Minitoutiao.log DEBUG 链接客户端:('127.0.0.1', 54742)成功
2019-05-08 11:18:28,804 Admin_memu.py [line:199] Admin_Minitoutiao.log DEBUG yankerp用户访问地址:localhost:8888/yankerp页面一共7...........
2019-05-08 11:18:28,804 Admin_memu.py [line:172] Admin_Minitoutiao.log DEBUG ------------------------服务端正在等待客户端链接------------------------
2019-05-08 11:18:28,805 Admin_memu.py [line:175] Admin_Minitoutiao.log DEBUG 链接客户端:('127.0.0.1', 54743)成功
2019-05-08 11:18:29,016 Admin_memu.py [line:199] Admin_Minitoutiao.log DEBUG favicon.ico用户访问地址:localhost:8888/favicon.ico页面一共7...........
2019-05-08 11:18:29,016 Admin_memu.py [line:172] Admin_Minitoutiao.log DEBUG ------------------------服务端正在等待客户端链接------------------------
2019-05-08 11:18:29,051 Admin_memu.py [line:175] Admin_Minitoutiao.log DEBUG 链接客户端:('127.0.0.1', 54744)成功
2019-05-08 11:18:29,057 Admin_memu.py [line:199] Admin_Minitoutiao.log DEBUG yankerp用户访问地址:localhost:8888/yankerp页面一共8...........
2019-05-08 11:18:29,058 Admin_memu.py [line:172] Admin_Minitoutiao.log DEBUG ------------------------服务端正在等待客户端链接------------------------
2019-05-08 11:18:29,913 Admin_memu.py [line:175] Admin_Minitoutiao.log DEBUG 链接客户端:('127.0.0.1', 54748)成功
2019-05-08 11:18:29,916 Admin_memu.py [line:199] Admin_Minitoutiao.log DEBUG yankerp用户访问地址:localhost:8888/yankerp页面一共9...........
2019-05-08 11:18:29,917 Admin_memu.py [line:172] Admin_Minitoutiao.log DEBUG ------------------------服务端正在等待客户端链接------------------------
2019-05-08 11:18:29,917 Admin_memu.py [line:175] Admin_Minitoutiao.log DEBUG 链接客户端:('127.0.0.1', 54749)成功
2019-05-08 11:18:29,953 Admin_memu.py [line:199] Admin_Minitoutiao.log DEBUG favicon.ico用户访问地址:localhost:8888/favicon.ico页面一共8...........
2019-05-08 11:18:29,956 Admin_memu.py [line:172] Admin_Minitoutiao.log DEBUG ------------------------服务端正在等待客户端链接------------------------
2019-05-08 11:18:30,163 Admin_memu.py [line:175] Admin_Minitoutiao.log DEBUG 链接客户端:('127.0.0.1', 54750)成功
2019-05-08 11:18:30,167 Admin_memu.py [line:199] Admin_Minitoutiao.log DEBUG yankerp用户访问地址:localhost:8888/yankerp页面一共10...........
2019-05-08 11:18:30,168 Admin_memu.py [line:172] Admin_Minitoutiao.log DEBUG ------------------------服务端正在等待客户端链接------------------------
2019-05-08 11:18:31,083 Admin_memu.py [line:175] Admin_Minitoutiao.log DEBUG 链接客户端:('127.0.0.1', 54754)成功
2019-05-08 11:18:31,086 Admin_memu.py [line:199] Admin_Minitoutiao.log DEBUG yankerp用户访问地址:localhost:8888/yankerp页面一共11...........
2019-05-08 11:18:31,087 Admin_memu.py [line:172] Admin_Minitoutiao.log DEBUG ------------------------服务端正在等待客户端链接------------------------
2019-05-08 11:18:31,087 Admin_memu.py [line:175] Admin_Minitoutiao.log DEBUG 链接客户端:('127.0.0.1', 54755)成功
2019-05-08 11:18:31,109 Admin_memu.py [line:199] Admin_Minitoutiao.log DEBUG favicon.ico用户访问地址:localhost:8888/favicon.ico页面一共9...........
2019-05-08 11:18:31,110 Admin_memu.py [line:172] Admin_Minitoutiao.log DEBUG ------------------------服务端正在等待客户端链接------------------------
2019-05-08 11:18:31,334 Admin_memu.py [line:175] Admin_Minitoutiao.log DEBUG 链接客户端:('127.0.0.1', 54756)成功
2019-05-08 11:18:31,338 Admin_memu.py [line:199] Admin_Minitoutiao.log DEBUG yankerp用户访问地址:localhost:8888/yankerp页面一共12...........
2019-05-08 11:18:31,339 Admin_memu.py [line:172] Admin_Minitoutiao.log DEBUG ------------------------服务端正在等待客户端链接------------------------
2019-05-08 11:18:32,233 Admin_memu.py [line:175] Admin_Minitoutiao.log DEBUG 链接客户端:('127.0.0.1', 54760)成功
2019-05-08 11:18:32,236 Admin_memu.py [line:199] Admin_Minitoutiao.log DEBUG yankerp用户访问地址:localhost:8888/yankerp页面一共13...........
2019-05-08 11:18:32,237 Admin_memu.py [line:172] Admin_Minitoutiao.log DEBUG ------------------------服务端正在等待客户端链接------------------------
2019-05-08 11:18:32,237 Admin_memu.py [line:175] Admin_Minitoutiao.log DEBUG 链接客户端:('127.0.0.1', 54761)成功
2019-05-08 11:18:32,257 Admin_memu.py [line:199] Admin_Minitoutiao.log DEBUG favicon.ico用户访问地址:localhost:8888/favicon.ico页面一共10...........
2019-05-08 11:18:32,258 Admin_memu.py [line:172] Admin_Minitoutiao.log DEBUG ------------------------服务端正在等待客户端链接------------------------
2019-05-08 11:18:32,483 Admin_memu.py [line:175] Admin_Minitoutiao.log DEBUG 链接客户端:('127.0.0.1', 54762)成功

log记录
在这里插入图片描述当输入一个不存在的名称时,自动跳转到主页
在这里插入图片描述log记录:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_39591494/article/details/89947846