版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39591494/article/details/89947846
#!/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记录: