使用flask框架开发web网站《情话王子》
不会跟女神聊天?今天用Python开发一个web网站
实现情话自由,让你没有把持不住的妹~
这里使用flask框架进行快速开发。
安装第三方库
1. 安装flask
pip install flask
2. 安装requests
pip install requests
导入
from flask import Flask, render_template, request, redirect
import time, requests, re
实例化flask对象
app = Flask(__name__)
@app.route('/', methods=['POST', 'GET'])
def index():
date = time.strftime('%H:%M:%S', time.localtime())
url = 'https://api.xcboke.cn/api/yulu?c=1001&encode=text'
text = requests.get(url).text
text = re.split('\s+|<br>', text)
texts = [re.sub('“|"|”|', '', x) for x in text]
print(texts)
text_list.append(texts)
size = len(texts)
return render_template('index.html', date=date, data=text_list, size=size)
ps:这里使用了api接口来获取情话,将请求结果用正则来分隔出聊天对话,并使用列表推导式将其中的不规则数据进行校正,形成数据集,并将它添加进列表当中。并列表数据传输给前端用于显示。
我们在项目中建立如下的目录结构:
css样式表1:reset.min.css:
html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline
}
article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {
display: block
}
body {
line-height: 1
}
ol, ul {
list-style: none
}
blockquote, q {
quotes: none
}
blockquote:before, blockquote:after, q:before, q:after {
content: '';
content: none
}
table {
border-collapse: collapse;
border-spacing: 0
}
css样式表2 : style.css
*, *:before, *:after {
box-sizing: border-box;
}
:root {
--white: #fff;
--black: #000;
--bg: #f8f8f8;
--grey: #999;
--dark: #1a1a1a;
--light: #e6e6e6;
--wrapper: 1000px;
--blue: #00b0ff;
}
body {
background-color: var(--bg);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-rendering: optimizeLegibility;
font-family: 'Source Sans Pro', sans-serif;
font-weight: 400;
background-image: url("https://img1.baidu.com/it/u=3294168837,435411012&fm=253&fmt=auto&app=138&f=JPEG?w=400&h=400");
background-size: cover;
background-repeat: none;
}
.wrapper {
position: relative;
left: 50%;
width: var(--wrapper);
height: 800px;
-webkit-transform: translate(-50%, 0);
transform: translate(-50%, 0);
}
.container {
position: relative;
top: 50%;
left: 50%;
width: 80%;
height: 75%;
background-color: var(--white);
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
}
.container .left {
float: left;
width: 37.6%;
height: 100%;
border: 1px solid var(--light);
background-color: var(--white);
}
.container .left .top {
position: relative;
width: 100%;
height: 96px;
padding: 29px;
}
.container .left .top:after {
position: absolute;
bottom: 0;
left: 50%;
display: block;
width: 80%;
height: 1px;
content: '';
background-color: var(--light);
-webkit-transform: translate(-50%, 0);
transform: translate(-50%, 0);
}
.container .left input {
float: left;
width: 188px;
height: 42px;
padding: 0 15px;
border: 1px solid var(--light);
background-color: #eceff1;
border-radius: 21px;
font-family: 'Source Sans Pro', sans-serif;
font-weight: 400;
}
.container .left input:focus {
outline: none;
}
.container .left a.search {
display: block;
float: left;
width: 42px;
height: 42px;
margin-left: 10px;
border: 1px solid var(--light);
background-color: var(--blue);
background-image: url("https://s3-us-west-2.amazonaws.com/s.cdpn.io/382994/name-type.png");
background-repeat: no-repeat;
background-position: top 12px left 14px;
border-radius: 50%;
}
.container .left .people {
margin-left: -1px;
border-right: 1px solid var(--light);
border-left: 1px solid var(--light);
width: calc(100% + 2px);
}
.container .left .people .person {
position: relative;
width: 100%;
padding: 12px 10% 16px;
cursor: pointer;
background-color: var(--white);
}
.container .left .people .person:after {
position: absolute;
bottom: 0;
left: 50%;
display: block;
width: 80%;
height: 1px;
content: '';
background-color: var(--light);
-webkit-transform: translate(-50%, 0);
transform: translate(-50%, 0);
}
.container .left .people .person img {
float: left;
width: 40px;
height: 40px;
margin-right: 12px;
border-radius: 50%;
}
.container .left .people .person .name {
font-size: 14px;
line-height: 22px;
color: var(--dark);
font-family: 'Source Sans Pro', sans-serif;
font-weight: 600;
}
.container .left .people .person .time {
font-size: 14px;
position: absolute;
top: 16px;
right: 10%;
padding: 0 0 5px 5px;
color: var(--grey);
background-color: var(--white);
}
.container .left .people .person .preview {
font-size: 14px;
display: inline-block;
overflow: hidden !important;
width: 70%;
white-space: nowrap;
text-overflow: ellipsis;
color: var(--grey);
}
.container .left .people .person.active, .container .left .people .person:hover {
margin-top: -1px;
margin-left: -1px;
padding-top: 13px;
border: 0;
background-color: var(--blue);
width: calc(100% + 2px);
padding-left: calc(10% + 1px);
}
.container .left .people .person.active span, .container .left .people .person:hover span {
color: var(--white);
background: transparent;
}
.container .left .people .person.active:after, .container .left .people .person:hover:after {
display: none;
}
.container .right {
position: relative;
float: left;
width: 62.4%;
height: 100%;
}
.container .right .top {
width: 100%;
height: 47px;
padding: 15px 29px;
background-color: #eceff1;
}
.container .right .top span {
font-size: 15px;
color: var(--grey);
}
.container .right .top span .name {
color: var(--dark);
font-family: 'Source Sans Pro', sans-serif;
font-weight: 600;
}
.container .right .chat {
position: relative;
display: none;
overflow: hidden;
padding: 0 35px 92px;
border-width: 1px 1px 1px 0;
border-style: solid;
border-color: var(--light);
height: calc(100% - 48px);
justify-content: flex-end;
flex-direction: column;
}
.container .right .chat.active-chat {
display: block;
display: flex;
}
.container .right .chat.active-chat .bubble {
transition-timing-function: cubic-bezier(0.4, -0.04, 1, 1);
}
.container .right .chat.active-chat .bubble:nth-of-type(1) {
-webkit-animation-duration: 0.15s;
animation-duration: 0.15s;
}
.container .right .chat.active-chat .bubble:nth-of-type(2) {
-webkit-animation-duration: 0.3s;
animation-duration: 0.3s;
}
.container .right .chat.active-chat .bubble:nth-of-type(3) {
-webkit-animation-duration: 0.45s;
animation-duration: 0.45s;
}
.container .right .chat.active-chat .bubble:nth-of-type(4) {
-webkit-animation-duration: 0.6s;
animation-duration: 0.6s;
}
.container .right .chat.active-chat .bubble:nth-of-type(5) {
-webkit-animation-duration: 0.75s;
animation-duration: 0.75s;
}
.container .right .chat.active-chat .bubble:nth-of-type(6) {
-webkit-animation-duration: 0.9s;
animation-duration: 0.9s;
}
.container .right .chat.active-chat .bubble:nth-of-type(7) {
-webkit-animation-duration: 1.05s;
animation-duration: 1.05s;
}
.container .right .chat.active-chat .bubble:nth-of-type(8) {
-webkit-animation-duration: 1.2s;
animation-duration: 1.2s;
}
.container .right .chat.active-chat .bubble:nth-of-type(9) {
-webkit-animation-duration: 1.35s;
animation-duration: 1.35s;
}
.container .right .chat.active-chat .bubble:nth-of-type(10) {
-webkit-animation-duration: 1.5s;
animation-duration: 1.5s;
}
.container .right .write {
position: absolute;
bottom: 29px;
left: 30px;
height: 42px;
padding-left: 8px;
border: 1px solid var(--light);
background-color: #eceff1;
width: calc(100% - 58px);
border-radius: 5px;
}
.container .right .write input {
font-size: 16px;
float: left;
width: 347px;
height: 40px;
padding: 0 10px;
color: var(--dark);
border: 0;
outline: none;
background-color: #eceff1;
font-family: 'Source Sans Pro', sans-serif;
font-weight: 400;
}
.container .right .write .write-link.attach:before {
display: inline-block;
float: left;
width: 20px;
height: 42px;
content: '';
background-image: url("https://s3-us-west-2.amazonaws.com/s.cdpn.io/382994/attachment.png");
background-repeat: no-repeat;
background-position: center;
}
.container .right .write .write-link.smiley:before {
display: inline-block;
float: left;
width: 20px;
height: 42px;
content: '';
background-image: url("https://s3-us-west-2.amazonaws.com/s.cdpn.io/382994/smiley.png");
background-repeat: no-repeat;
background-position: center;
}
.container .right .write .write-link.send:before {
display: inline-block;
float: left;
width: 20px;
height: 42px;
margin-left: 11px;
content: '';
background-image: url("https://s3-us-west-2.amazonaws.com/s.cdpn.io/382994/send.png");
background-repeat: no-repeat;
background-position: center;
}
.container .right .bubble {
font-size: 16px;
position: relative;
display: inline-block;
clear: both;
margin-bottom: 8px;
padding: 13px 14px;
vertical-align: top;
border-radius: 5px;
}
.container .right .bubble:before {
position: absolute;
top: 19px;
display: block;
width: 8px;
height: 6px;
content: '\00a0';
-webkit-transform: rotate(29deg) skew(-35deg);
transform: rotate(29deg) skew(-35deg);
}
.container .right .bubble.you {
float: left;
color: var(--white);
background-color: var(--blue);
align-self: flex-start;
-webkit-animation-name: slideFromLeft;
animation-name: slideFromLeft;
}
.container .right .bubble.you:before {
left: -3px;
background-color: var(--blue);
}
.container .right .bubble.me {
float: right;
color: var(--dark);
background-color: #eceff1;
align-self: flex-end;
-webkit-animation-name: slideFromRight;
animation-name: slideFromRight;
}
.container .right .bubble.me:before {
right: -3px;
background-color: #eceff1;
}
.container .right .conversation-start {
position: relative;
width: 100%;
margin-bottom: 27px;
text-align: center;
}
.container .right .conversation-start span {
font-size: 14px;
display: inline-block;
color: var(--grey);
}
.container .right .conversation-start span:before, .container .right .conversation-start span:after {
position: absolute;
top: 10px;
display: inline-block;
width: 30%;
height: 1px;
content: '';
background-color: var(--light);
}
.container .right .conversation-start span:before {
left: 0;
}
.container .right .conversation-start span:after {
right: 0;
}
@keyframes slideFromLeft {
0% {
margin-left: -200px;
opacity: 0;
}
100% {
margin-left: 0;
opacity: 1;
}
}
@-webkit-keyframes slideFromLeft {
0% {
margin-left: -200px;
opacity: 0;
}
100% {
margin-left: 0;
opacity: 1;
}
}
@keyframes slideFromRight {
0% {
margin-right: -200px;
opacity: 0;
}
100% {
margin-right: 0;
opacity: 1;
}
}
@-webkit-keyframes slideFromRight {
0% {
margin-right: -200px;
opacity: 0;
}
100% {
margin-right: 0;
opacity: 1;
}
}
js处理代码:
document.querySelector('.chat[data-chat=person2]').classList.add('active-chat');
document.querySelector('.person[data-chat=person2]').classList.add('active');
var friends = {
list: document.querySelector('ul.people'),
all: document.querySelectorAll('.left .person'),
name: ''
},
chat = {
container: document.querySelector('.container .right'),
current: null,
person: null,
name: document.querySelector('.container .right .top .name')
};
friends.all.forEach(function (f) {
f.addEventListener('mousedown', function () {
f.classList.contains('active') || setAciveChat(f);
});
});
function setAciveChat(f) {
friends.list.querySelector('.active').classList.remove('active');
f.classList.add('active');
chat.current = chat.container.querySelector('.active-chat');
chat.person = f.getAttribute('data-chat');
chat.current.classList.remove('active-chat');
chat.container.querySelector('[data-chat="' + chat.person + '"]').classList.add('active-chat');
friends.name = f.querySelector('.name').innerText;
chat.name.innerHTML = friends.name;
}
html模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>情话王子</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="../static/css/reset.min.css">
<link rel="stylesheet" href="../static/css/style.css">
</head>
<body>
<div class="wrapper">
<div class="container">
<div class="left">
<div class="top">
<input type="text" placeholder="搜索"/>
<a href="javascript:;" class="search"></a>
</div>
<ul class="people">
<li class="person" data-chat="person1">
<img src="../static/imgs/thomas.jpg" alt=""/>
<span class="name">你的精致女友</span>
<span class="time">{{date}}</span>
<span class="preview">快来学习如何撩我吧~...</span>
</li>
</ul>
</div>
<div class="right">
<div class="chat" data-chat="person2">
{%for i in data%}
<div class="conversation-start">
<span>{{date}}</span>
</div>
{% if size == 1%}
<div class="bubble me">
{{i[0]}}
</div>
{%elif size == 2%}
<div class="bubble me">
{{i[0]}}
</div>
<div class="bubble you">
{{i[1]}}
</div>
{%elif size == 3%}
<div class="bubble me">
{{ i[0] }}
</div>
<div class="bubble you">
{{ i[1] }}
</div>
<div class="bubble me">
{{ i[2] }}
</div>
{%endif%}
{%endfor%}
</div>
<div class="write" style="text-align: center">
<form action="" method="post">
<input style="border-radius: 30px;color: white;text-align: center;background-color: #00b0ff"
type="submit" value="获取情话">
</form>
</div>
</div>
</div>
</div>
<script src="../static/js/index.js"></script>
</body>
</html>
Jinjia2语法:
{%for i in data%}
<div class="conversation-start">
<span>{{date}}</span>
</div>
{% if size == 1%}
<div class="bubble me">
{{i[0]}}
</div>
{%elif size == 2%}
<div class="bubble me">
{{i[0]}}
</div>
<div class="bubble you">
{{i[1]}}
</div>
{%elif size == 3%}
<div class="bubble me">
{{ i[0] }}
</div>
<div class="bubble you">
{{ i[1] }}
</div>
<div class="bubble me">
{{ i[2] }}
</div>
{%endif%}
{%endfor%}
通过后端传递的列表动态添加情话数据。
完结
以上就是 今天的全部内容了,看看效果吧 ~
已关注
Follow
Replay
Like
Python编程站
Added to Top Stories
0/0
00:00
/
00:08
00:00
/
00:08
00:08
全屏
倍速播放中
继续观看
使用flask框架开发web网站《情话王子》
转载
,
使用flask框架开发web网站《情话王子》
Python编程站
Added to Top Stories
往期精彩回顾
情话王子
即可领取完整代码资源。