使用flask框架开发web网站《情话王子》

简介: 使用flask框架开发web网站《情话王子》

不会跟女神聊天?今天用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%}


通过后端传递的列表动态添加情话数据。


完结

相关文章
|
21天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
120 45
|
3天前
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
14 2
|
17天前
|
SQL 安全 PHP
探索PHP的现代演进:从Web开发到框架创新
PHP是一种流行的服务器端脚本语言,自诞生以来在Web开发领域占据重要地位。从简单的网页脚本到支持面向对象编程的现代语言,PHP经历了多次重大更新。本文探讨PHP的现代演进历程,重点介绍其在Web开发中的应用及框架创新,如Laravel、Symfony等。这些框架不仅简化了开发流程,还提高了开发效率和安全性。
24 3
|
16天前
|
前端开发 JavaScript 开发工具
从框架到现代Web开发实践
从框架到现代Web开发实践
25 1
|
17天前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
31 1
|
19天前
|
SQL 安全 PHP
探索PHP的现代演进:从Web开发到框架创新
PHP 自发布以来一直在 Web 开发领域占据重要地位,历经多次重大更新,从简单的脚本语言进化为支持面向对象编程的现代语言。本文探讨 PHP 的演进历程,重点介绍其在 Web 开发中的应用及框架创新。自 PHP 5.3 引入命名空间后,PHP 迈向了面向对象编程时代;PHP 7 通过优化内核大幅提升性能;PHP 8 更是带来了属性、刚性类型等新特性。
25 3
|
19天前
|
XML 安全 PHP
PHP与SOAP Web服务开发:基础与进阶教程
本文介绍了PHP与SOAP Web服务的基础和进阶知识,涵盖SOAP的基本概念、PHP中的SoapServer和SoapClient类的使用方法,以及服务端和客户端的开发示例。此外,还探讨了安全性、性能优化等高级主题,帮助开发者掌握更高效的Web服务开发技巧。
|
22天前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
34 2
|
22天前
|
人工智能 搜索推荐 PHP
PHP在Web开发中的璀璨星辰:构建动态网站的幕后英雄###
【10月更文挑战第25天】 本文将带您穿越至PHP的宇宙,揭示其作为Web开发常青树的奥秘。通过生动实例与深入解析,展现PHP如何以简便、高效、灵活的姿态,赋能开发者打造动态交互式网站,同时不忘探讨其在新时代技术浪潮中面临的挑战与机遇,激发对技术创新与应用的无限思考。 ###
32 1
WK
|
22天前
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
36 0
下一篇
无影云桌面