基于Python的Flask框架制作动态网站-第二部分

本文介绍了如何使用Python的Flask框架创建一个实时聊天应用,包括使用datetime库记录消息发送时间,Session机制实现用户身份管理,以及动态网页渲染。通过GET和POST请求处理,用户可以发送消息并查看历史对话。
摘要由CSDN通过智能技术生成

引入时间

我们聊天的时候,除了内容,时间也是很关键的信息。

那么此时需要使用datetime库来记录每一条消息的发出时间。

from datetime import datetime
from flask import Flask, redirect

app = Flask(__name__)
messages = [] # 保存聊天信息


def add_messages(username, message):
    # 添加消息,保存在列表里面
    now = datetime.now().strftime("%Y-%m-%d %H:%M:%S") # 记录时间:格式:00:00:00
    messages.append("({}) {}: {}".format(now, username, message))

引入网页渲染模板

在文件夹中添加templates文件夹,里面添加一个网页文档index1.html

<html>
    <head>
        <title>首页</title>
    </head>
    
    <body>
        <p>发送信息格式: /名字/消息内容 </p>
    </body>
</html>

完整代码

from datetime import datetime
from flask import Flask, redirect, render_template

app = Flask(__name__)
messages = [] # 保存聊天信息


def add_messages(username, message):
    # 添加消息,保存在列表里面
    now = datetime.now().strftime("%H:%M:%S") # 记录时间:格式:00:00:00
    messages.append("({}) {}: {}".format(now, username, message))

def get_all_messages():
    """获取关于我的所有聊天信息`"""
    return "<br>".join(messages)


@app.route("/")
def index():
    """主页"""
    return render_template("index1.html") # 加载我们的网页文档


@app.route("/<username>")
def user(username):
    """显示所有消息"""
    return "<h1>欢迎, {0}</h1>{1}".format(username, get_all_messages())


@app.route("/<username>/<message>")
def send_message(username, message):
    """
    通过路由设置:/人名称/信息内容 来实现发送信息给某人
    添加信息到列表里面,然后返回到用户页面
    """
    add_messages(username, message)
    return redirect("/" + username)

app.run() # 启动服务器

让浏览器记住用户

需要引入Session机制, 那么什么是Session?

解释session:

当访问服务器否个网页的时候,会在服务器端的内存里开辟一块内存,这块内存就叫做session,而这个内存是跟浏览器关联在一起的。这个浏览器指的是浏览器窗口,或者是浏览器的子窗口,意思就是,只允许当前这个session对应的浏览器访问,就算是在同一个机器上新启的浏览器也是无法访问的。而另外一个浏览器也需要记录session的话,就会再启一个属于自己的session.

简单来说:session就是服务器里面的一块内存,内存里面能放任何东西,只要是名值对就可以了,类似Python里面的字典

主页逻辑

当用户第一次浏览网站的时候,Session中没有用户,

那么我们就给一个表单,让用户填写用户名然后用post提交数据,然后把用户信息放到Session

然后下次打开网页就不需要登记用户名,服务器已经知道你是谁了。

动态网站基本成型

from datetime import datetime
from flask import Flask, redirect, render_template, request, session


app = Flask(__name__)
app.secret_key = "randomstring12345"  # 大家可以不一样的,用于生成随机ID的随机种子,类似random的seed
messages = []


def add_messages(username, message):
    # 添加消息,保存在列表里面
    now = datetime.now().strftime("%H:%M:%S") # 记录时间:格式:00:00:00
    messages.append("({}) {}: {}".format(now, username, message))

def get_all_messages():
    """获取关于我的所有聊天信息`"""
    return "<br>".join(messages)



@app.route("/", methods=["GET", "POST"])  # 允许的方法有POST和GET,其他不写methods默认就是GET
def index():
    """主页"""
    if request.method == "POST":
        # 如果是POST请求,进入这里,在请求中把username放到session里面
        session["username"] = request.form["username"]

    if "username" in session:
        # 如果session中有username这个键值,就转跳到对应的用户页面
        return redirect(session["username"])
    
    # 如果没有,就展示首页网页。
    return render_template("index2.html")


@app.route("/<username>")
def user(username):
    """显示所有消息"""
    return "<h1>欢迎, {0}</h1>{1}".format(username, get_all_messages())


@app.route("/<username>/<message>")
def send_message(username, message):
    """
    通过路由设置:/人名称/信息内容 来实现发送信息给某人
    添加信息到列表里面,然后返回到用户页面
    """
    add_messages(username, message)
    return redirect("/" + username)

app.run() # 启动服务器

补充知识

浏览器将GET和POST定义为:

在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST。

GET - 从指定的资源请求数据。

POST - 向指定的资源提交要被处理的数据。

学习参考链接:https://www.runoob.com/tags/html-httpmethods.html

Flask-Paginate是一个Flask扩展,它提供了一种简单的方法来实现分功能。它基于SQLAlchemy,并且可以与任何SQLAlchemy支持的数据库一起使用。 首先,你需要安装Flask-Paginate扩展。可以通过以下命令来安装: ``` pip install Flask-Paginate ``` 然后,你需要导入Flask-Paginate扩展并创建一个分器。以下是一个简单的示例: ```python from flask_paginate import Pagination, get_page_args @app.route('/') def index(): # 获取当前码和每显示的数量 page, per_page, offset = get_page_args(page_parameter='page', per_page_parameter='per_page') # 从数据库中获取数据 data = get_data_from_database(offset=offset, per_page=per_page) # 创建分器 pagination = Pagination(page=page, per_page=per_page, total=count_total_items_in_database(), css_framework='bootstrap4') # 渲染模板 return render_template('index.html', data=data, pagination=pagination) ``` 在上面的示例中,我们首先使用`get_page_args`函数从请求参数中获取当前码和每显示的数量。然后,我们从数据库中获取数据,并使用`Pagination`类创建一个分器对象。最后,我们将数据和分器对象传递给模板进行渲染。 在模板中,你可以使用`prev_href`,`next_href`和`links`属性来生成分器的HTML代码。以下是一个简单的示例: ```html <div class="pagination"> <a href="{{ pagination.prev_href() }}">Previous</a> {% for page in pagination.links %} {% if page == '...' %} <span class="ellipsis">...</span> {% elif page == pagination.page %} <span class="current">{{ page }}</span> {% else %} <a href="{{ page }}">{{ page }}</a> {% endif %} {% endfor %} <a href="{{ pagination.next_href() }}">Next</a> </div> ``` 上面的代码会生成一个类似于以下HTML代码的分器: ```html <div class="pagination"> <a href="/?page=1&per_page=10">Previous</a> <a href="/?page=1&per_page=10">1</a> <a href="/?page=2&per_page=10">2</a> <a href="/?page=3&per_page=10">3</a> <a href="/?page=4&per_page=10">4</a> <a href="/?page=5&per_page=10">5</a> <span class="ellipsis">...</span> <a href="/?page=10&per_page=10">10</a> <a href="/?page=2&per_page=10">Next</a> </div> ``` 此外,你还可以使用`prev_disabled`和`next_disabled`属性来禁用“上一”和“下一”链接,如果当前码是第一或最后一的话。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值