不会跟女神聊天?今天用Python开发一个web网站
实现情话自由,让你没有把持不住的妹~
这里使用flask框架进行快速开发。
Flask简介
Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手。它可以很好地结合MVC模式进行开发,开发人员分工合作,小型团队在短时间内就可以完成功能丰富的中小型网站或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%}
通过后端传递的列表动态添加情话数据。
完结