vlambda博客
学习文章列表

使用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接口来获取情话,将请求结果用正则来分隔出聊天对话,并使用列表推导式将其中的不规则数据进行校正,形成数据集,并将它添加进列表当中。并列表数据传输给前端用于显示。



 

前端部分


 我们在项目中建立如下的目录结构:


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


css样式表1:reset.min.css:


htmlbodydivspanappletobjectiframeh1h2h3h4h5h6pblockquotepreaabbracronymaddressbigcitecodedeldfnemimginskbdqssampsmallstrikestrongsubsupttvarbuicenterdldtddolullifieldsetformlabellegendtablecaptiontbodytfoottheadtrthtdarticleasidecanvasdetailsembedfigurefigcaptionfooterheaderhgroupmenunavoutputrubysectionsummarytimemarkaudiovideo {
    margin0;
    padding0;
    border0;
    font-size100%;
    font: inherit;
    vertical-align: baseline
}

articleasidedetailsfigcaptionfigurefooterheaderhgroupmenunavsection {
    display: block
}

body {
    line-height1
}

olul {
    list-style: none
}

blockquoteq {
    quotes: none
}

blockquote:beforeblockquote:afterq:beforeq:after {
    content'';
    content: none
}

table {
    border-collapse: collapse;
    border-spacing0
}


css样式表2 : style.css


*, *:before, *:after {
    box-sizing: border-box;
}

:root {
    --white#fff;
    --black#000;
    --bg#f8f8f8;
    --grey#999;
    --dark#1a1a1a;
    --light#e6e6e6;
    --wrapper1000px;
    --blue#00b0ff;
}

body {
    background-colorvar(--bg);
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    text-rendering: optimizeLegibility;
    font-family'Source Sans Pro', sans-serif;
    font-weight400;
    background-imageurl("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;
    left50%;
    widthvar(--wrapper);
    height800px;
    -webkit-transformtranslate(-50%, 0);
    transformtranslate(-50%, 0);
}

.container {
    position: relative;
    top50%;
    left50%;
    width80%;
    height75%;
    background-colorvar(--white);
    -webkit-transformtranslate(-50%, -50%);
    transformtranslate(-50%, -50%);
}

.container .left {
    float: left;
    width37.6%;
    height100%;
    border1px solid var(--light);
    background-colorvar(--white);
}

.container .left .top {
    position: relative;
    width100%;
    height96px;
    padding29px;
}

.container .left .top:after {
    position: absolute;
    bottom0;
    left50%;
    display: block;
    width80%;
    height1px;
    content'';
    background-colorvar(--light);
    -webkit-transformtranslate(-50%, 0);
    transformtranslate(-50%, 0);
}

.container .left input {
    float: left;
    width188px;
    height42px;
    padding0 15px;
    border1px solid var(--light);
    background-color#eceff1;
    border-radius21px;
    font-family'Source Sans Pro', sans-serif;
    font-weight400;
}

.container .left input:focus {
    outline: none;
}

.container .left a.search {
    display: block;
    float: left;
    width42px;
    height42px;
    margin-left10px;
    border1px solid var(--light);
    background-colorvar(--blue);
    background-imageurl("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-radius50%;
}

.container .left .people {
    margin-left: -1px;
    border-right1px solid var(--light);
    border-left1px solid var(--light);
    widthcalc(100% + 2px);
}

.container .left .people .person {
    position: relative;
    width100%;
    padding12px 10% 16px;
    cursor: pointer;
    background-colorvar(--white);
}

.container .left .people .person:after {
    position: absolute;
    bottom0;
    left50%;
    display: block;
    width80%;
    height1px;
    content'';
    background-colorvar(--light);
    -webkit-transformtranslate(-50%, 0);
    transformtranslate(-50%, 0);
}

.container .left .people .person img {
    float: left;
    width40px;
    height40px;
    margin-right12px;
    border-radius50%;
}

.container .left .people .person .name {
    font-size14px;
    line-height22px;
    colorvar(--dark);
    font-family'Source Sans Pro', sans-serif;
    font-weight600;
}

.container .left .people .person .time {
    font-size14px;
    position: absolute;
    top16px;
    right10%;
    padding0 0 5px 5px;
    colorvar(--grey);
    background-colorvar(--white);
}

.container .left .people .person .preview {
    font-size14px;
    display: inline-block;
    overflow: hidden !important;
    width70%;
    white-space: nowrap;
    text-overflow: ellipsis;
    colorvar(--grey);
}

.container .left .people .person.active.container .left .people .person:hover {
    margin-top: -1px;
    margin-left: -1px;
    padding-top13px;
    border0;
    background-colorvar(--blue);
    widthcalc(100% + 2px);
    padding-leftcalc(10% + 1px);
}

.container .left .people .person.active span.container .left .people .person:hover span {
    colorvar(--white);
    background: transparent;
}

.container .left .people .person.active:after.container .left .people .person:hover:after {
    display: none;
}

.container .right {
    position: relative;
    float: left;
    width62.4%;
    height100%;
}

.container .right .top {
    width100%;
    height47px;
    padding15px 29px;
    background-color#eceff1;
}

.container .right .top span {
    font-size15px;
    colorvar(--grey);
}

.container .right .top span .name {
    colorvar(--dark);
    font-family'Source Sans Pro', sans-serif;
    font-weight600;
}

.container .right .chat {
    position: relative;
    display: none;
    overflow: hidden;
    padding0 35px 92px;
    border-width1px 1px 1px 0;
    border-style: solid;
    border-colorvar(--light);
    heightcalc(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-functioncubic-bezier(0.4, -0.04, 1, 1);
}

.container .right .chat.active-chat .bubble:nth-of-type(1) {
    -webkit-animation-duration0.15s;
    animation-duration0.15s;
}

.container .right .chat.active-chat .bubble:nth-of-type(2) {
    -webkit-animation-duration0.3s;
    animation-duration0.3s;
}

.container .right .chat.active-chat .bubble:nth-of-type(3) {
    -webkit-animation-duration0.45s;
    animation-duration0.45s;
}

.container .right .chat.active-chat .bubble:nth-of-type(4) {
    -webkit-animation-duration0.6s;
    animation-duration0.6s;
}

.container .right .chat.active-chat .bubble:nth-of-type(5) {
    -webkit-animation-duration0.75s;
    animation-duration0.75s;
}

.container .right .chat.active-chat .bubble:nth-of-type(6) {
    -webkit-animation-duration0.9s;
    animation-duration0.9s;
}

.container .right .chat.active-chat .bubble:nth-of-type(7) {
    -webkit-animation-duration1.05s;
    animation-duration1.05s;
}

.container .right .chat.active-chat .bubble:nth-of-type(8) {
    -webkit-animation-duration1.2s;
    animation-duration1.2s;
}

.container .right .chat.active-chat .bubble:nth-of-type(9) {
    -webkit-animation-duration1.35s;
    animation-duration1.35s;
}

.container .right .chat.active-chat .bubble:nth-of-type(10) {
    -webkit-animation-duration1.5s;
    animation-duration1.5s;
}

.container .right .write {
    position: absolute;
    bottom29px;
    left30px;
    height42px;
    padding-left8px;
    border1px solid var(--light);
    background-color#eceff1;
    widthcalc(100% - 58px);
    border-radius5px;
}

.container .right .write input {
    font-size16px;
    float: left;
    width347px;
    height40px;
    padding0 10px;
    colorvar(--dark);
    border0;
    outline: none;
    background-color#eceff1;
    font-family'Source Sans Pro', sans-serif;
    font-weight400;
}

.container .right .write .write-link.attach:before {
    display: inline-block;
    float: left;
    width20px;
    height42px;
    content'';
    background-imageurl("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;
    width20px;
    height42px;
    content'';
    background-imageurl("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;
    width20px;
    height42px;
    margin-left11px;
    content'';
    background-imageurl("https://s3-us-west-2.amazonaws.com/s.cdpn.io/382994/send.png");
    background-repeat: no-repeat;
    background-position: center;
}

.container .right .bubble {
    font-size16px;
    position: relative;
    display: inline-block;
    clear: both;
    margin-bottom8px;
    padding13px 14px;
    vertical-align: top;
    border-radius5px;
}

.container .right .bubble:before {
    position: absolute;
    top19px;
    display: block;
    width8px;
    height6px;
    content'\00a0';
    -webkit-transformrotate(29deg) skew(-35deg);
    transformrotate(29deg) skew(-35deg);
}

.container .right .bubble.you {
    float: left;
    colorvar(--white);
    background-colorvar(--blue);
    align-self: flex-start;
    -webkit-animation-name: slideFromLeft;
    animation-name: slideFromLeft;
}

.container .right .bubble.you:before {
    left: -3px;
    background-colorvar(--blue);
}

.container .right .bubble.me {
    float: right;
    colorvar(--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;
    width100%;
    margin-bottom27px;
    text-align: center;
}

.container .right .conversation-start span {
    font-size14px;
    display: inline-block;
    colorvar(--grey);
}

.container .right .conversation-start span:before.container .right .conversation-start span:after {
    position: absolute;
    top10px;
    display: inline-block;
    width30%;
    height1px;
    content'';
    background-colorvar(--light);
}

.container .right .conversation-start span:before {
    left0;
}

.container .right .conversation-start span:after {
    right0;
}

@keyframes slideFromLeft {
    0% {
        margin-left: -200px;
        opacity0;
    }
    100% {
        margin-left0;
        opacity1;
    }
}

@-webkit-keyframes slideFromLeft {
    0% {
        margin-left: -200px;
        opacity0;
    }
    100% {
        margin-left0;
        opacity1;
    }
}

@keyframes slideFromRight {
    0% {
        margin-right: -200px;
        opacity0;
    }
    100% {
        margin-right0;
        opacity1;
    }
}

@-webkit-keyframes slideFromRight {
    0% {
        margin-right: -200px;
        opacity0;
    }
    100% {
        margin-right0;
        opacity1;
    }
}


js处理代码:

document.querySelector('.chat[data-chat=person2]').classList.add('active-chat');
document.querySelector('.person[data-chat=person2]').classList.add('active');

var friends = {
        listdocument.querySelector('ul.people'),
        alldocument.querySelectorAll('.left .person'),
        name''
    },

    chat = {
        containerdocument.querySelector('.container .right'),
        currentnull,
        personnull,
        namedocument.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%}


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


完结

 以上就是 今天的全部内容了,看看效果吧 ~


Replay Share Like

0/0

进度条,百分之0
00:00
/
00:08
00:08
全屏

继续观看

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

转载
,
使用flask框架开发web网站《情话王子》
Python编程站


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

往期精彩回顾

 


 







情话王子

即可领取完整代码资源。