给Flask加上百度翻译功能,这样可以用中文进行搜索了

上一篇博客:Flask之手搓bootstrap翻页-CSDN博客 里,对 OMDb API - The Open Movie Database 的搜索,只能使用英文,才能搜索出电影信息,如果使用中文,是搜索不到结果的。这里就需要使用翻译,把中文电影名翻译成英文电影名。

这里使用百度翻译,百度翻译量少的话是免费的,百度翻译开放平台,而且有python的示例代码,可以直接照抄。

python 复制代码
# -*- coding: utf-8 -*-

# This code shows an example of text translation from English to Simplified-Chinese.
# This code runs on Python 2.7.x and Python 3.x.
# You may install `requests` to run this code: pip install requests
# Please refer to `https://api.fanyi.baidu.com/doc/21` for complete api document

import requests
import random
import json
from hashlib import md5

# Set your own appid/appkey.
appid = 'INPUT_YOUR_APPID'
appkey = 'INPUT_YOUR_APPKEY'

# For list of language codes, please refer to `https://api.fanyi.baidu.com/doc/21`
from_lang = 'en'
to_lang =  'zh'

endpoint = 'http://api.fanyi.baidu.com'
path = '/api/trans/vip/translate'
url = endpoint + path

query = 'Hello World! This is 1st paragraph.\nThis is 2nd paragraph.'

# Generate salt and sign
def make_md5(s, encoding='utf-8'):
    return md5(s.encode(encoding)).hexdigest()

salt = random.randint(32768, 65536)
sign = make_md5(appid + query + str(salt) + appkey)

# Build request
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
payload = {'appid': appid, 'q': query, 'from': from_lang, 'to': to_lang, 'salt': salt, 'sign': sign}

# Send request
r = requests.post(url, params=payload, headers=headers)
result = r.json()

# Show response
print(json.dumps(result, indent=4, ensure_ascii=False))

只需要在搜索路由里,将form表单传递过来的中文搜索词翻译成英文即可。如果是英文,那就让它再翻译一遍,一般是没有变化。

详细代码如下。

app.py

python 复制代码
from flask import Flask, render_template, request
import requests
import math
import json
import random
from hashlib import md5

app = Flask(__name__)


@app.route('/', methods=["GET"])
# @app.route('/?s=<s>&page=<page>', methods=["GET"])
def main():
    s = request.args.get("s")
    page = request.args.get("page")
    if page is None:
        page = 1
    else:
        page = int(request.args.get("page"))
    if s is None:
        s = 'superman'
    # Here is your key: 4ee0241e
    # OMDb API: http://www.omdbapi.com/?i=tt3896198&apikey=4ee0241e
    # rawData = requests.get("http://www.omdbapi.com/?apikey=4ee0241e&s=batman&page=1")
    rawData = requests.get(f"http://www.omdbapi.com/?apikey=4ee0241e&s={s}&page={page}")
    movies = rawData.json()
    if movies["Response"] == "True":
        pages = math.ceil(int(movies["totalResults"]) / 10)
    else:
        pages = 0
    data = dict(
        movies=movies,
        active1="active",
        active2="",
        pages=pages,
        page=page,
        s=s,
    )
    return render_template("index.html", data=data)


@app.route('/', methods=["POST"])
def search():
    s = request.form["name"]
    en_s = fanyi(s)
    page = 1
    rawData = requests.get(f"http://www.omdbapi.com/?apikey=4ee0241e&s={en_s}&page={page}")
    movies = rawData.json()
    if movies["Response"] == "True":
        pages = math.ceil(int(movies["totalResults"]) / 10)
    else:
        pages = 0
    data = dict(
        movies=movies,
        active1="active",
        active2="",
        pages=pages,
        page=page,
        s=s,
    )
    return render_template("index.html", data=data)


def fanyi(s):
    # Set your own appid/appkey.
    appid = 'INPUT_YOUR_APPID'
    appkey = 'INPUT_YOUR_APPKEY'
    # For list of language codes, please refer to `https://api.fanyi.baidu.com/doc/21`
    from_lang = 'zh'
    to_lang = 'en'

    endpoint = 'http://api.fanyi.baidu.com'
    path = '/api/trans/vip/translate'
    url = endpoint + path

    # query = 'Hello World! This is 1st paragraph.\nThis is 2nd paragraph.'
    query = s

    # Generate salt and sign
    def make_md5(sm, encoding='utf-8'):
        return md5(sm.encode(encoding)).hexdigest()

    salt = random.randint(32768, 65536)
    sign = make_md5(appid + query + str(salt) + appkey)

    # Build request
    headers = {'Content-Type': 'application/x-www-form-urlencoded'}
    payload = {'appid': appid, 'q': query, 'from': from_lang, 'to': to_lang, 'salt': salt, 'sign': sign}

    # Send request
    r = requests.post(url, params=payload, headers=headers)
    result = r.json()

    # Show response
    # print(json.dumps(result["trans_result"][0]["dst"], indent=4, ensure_ascii=False))
    # print(json.dumps(result, indent=4, ensure_ascii=False))  # "superman"
    # print(result["trans_result"][0]["dst"])   # superman
    return result["trans_result"][0]["dst"]


@app.route('/<imdbID>')
def movie_by_title(imdbID):
    # rawData = requests.get("http://www.omdbapi.com/?apikey=4ee0241e&i={}".format(imdbID))
    rawData = requests.get(f"http://www.omdbapi.com/?apikey=4ee0241e&i={imdbID}")
    movie = rawData.json()
    data = dict(
        movie=movie,
        active1="",
        active2="active",
    )
    return render_template("movie.html", data=data)


if __name__ == '__main__':
    app.run(debug=True)

footer.html

python 复制代码
<div class="mt-3">
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"
            integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL"
            crossorigin="anonymous"></script>
</div>

header.html

python 复制代码
<meta charset="UTF-8">
<title>母版</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"
      integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">

nav.html

python 复制代码
<div class="contain  bg-body-tertiary">
    <nav class="navbar navbar-expand-lg container">
        <div class="container-fluid">
            <a class="navbar-brand">电影</a>
            <button class="navbar-toggler" type="button" data-bs-toggle="collapse"
                    data-bs-target="#navbarSupportedContent"
                    aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
                <span class="navbar-toggler-icon"></span>
            </button>
            <div class="collapse navbar-collapse" id="navbarSupportedContent">
                <ul class="navbar-nav me-auto mb-2 mb-lg-0">
                    <li class="nav-item {{ data["active1"] }}">
                        <a class="nav-link" aria-current="page" href="/">首页</a>
                    </li>
                    <li class="nav-item {{ data["active2"] }}">
                        <a class="nav-link" href="javascript:(0)">详情</a>
                    </li>
                </ul>
                <form class="d-flex" role="search" method="post" action="{{ url_for('search') }}">
                    <input class="form-control me-2" type="search" name="name" placeholder="搜索影片" value="{{ data.s }}"
                           aria-label="Search">
                    <button class="btn btn-outline-success" type="submit">search</button>
                </form>
            </div>
        </div>
    </nav>
</div>

home.html

python 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    {% block head %}
        {% include './common/header.html' %}
    {% endblock %}
    <style>
        .card:hover {
            box-shadow: 10px 5px 5px #ccc;
        }

        .active {
            background: rgb(208, 216, 222);
        }

        .navbar {
            --bs-navbar-padding-y: 0;
        }

        .nav-link {
            padding: 20px;
        }

        .row > * {
            padding-left: 0;
        }
    </style>
</head>
<body>
{% block nav %}
    {% include './common/nav.html' %}
{% endblock %}
<div class="container mt-3">
    <div class="row">
        {% block content %}
        {% endblock %}
    </div>
</div>
{% block footer %}
    {% include './common/footer.html' %}
{% endblock %}
</body>
</html>

movie.html

python 复制代码
{% extends "common/home.html" %}

{% block content %}
    <div class="d-flex align-items-center justify-content-center">
        <div class="card mb-3" style="max-width: 1080px;">
            <div class="row">
                <div class="col-md-4">
                    <img src="{{ data["movie"].Poster }}" class="img-fluid rounded-start" alt="...">
                </div>
                <div class="col-md-8">
                    <div class="card-body">
                        <h5 class="card-title">{{ data["movie"].Title }}</h5>
                        <p class="card-text">Year:{{ data["movie"].Year }}</p>
                        <p class="card-text">Runtime:{{ data["movie"].Runtime }}</p>
                        <p class="card-text">Actors:{{ data["movie"].Actors }}</p>
                        <p class="card-text">{{ data["movie"].Actors }}</p>
                        <p class="card-text">{{ data["movie"].Year }}</p>
                        <p class="card-text"><small class="text-body-secondary">{{ data["movie"].Plot }}</small></p>
                    </div>
                    <div class="d-flex align-items-center justify-content-center">
                        <a href="{{ url_for("main") }}" class="btn btn-success">返回</a>
                    </div>
                </div>
            </div>
        </div>
    </div>
{% endblock %}

index.html

python 复制代码
{% extends "common/home.html" %}

{% block content %}
    {% for movie in data["movies"].Search %}
        <div class="col text-center mt-3">
            <div class="card" style="height: 510px;overflow: hidden;width: 240px;">
                <img src="{{ movie.Poster }}" height="350" class="card-img-top" alt="...">
                <div class="card-body">
                    <h5 class="card-title" style="height: 48px;">{{ movie.Title[:35] }}</h5>
                    <p class="card-text">{{ movie.Year }}</p>
                    <a href="/{{ movie.imdbID }}" class="btn btn-primary">详情</a>
                </div>
            </div>
        </div>
    {% endfor %}
    {#    翻页    #}
    <div class="d-flex align-items-center justify-content-center">
        <div class="mt-3 mb-5">
            <nav aria-label="Page navigation example">
                {% if data.pages>0 %}

                    <ul class="pagination pagination-lg justify-content-center">
                        <li class="page-item {{ 'disabled' if data.page==1 else '' }}">
                            <a class="page-link" href="/?s={{ data.s }}&page={{ data.page -  1 }}"
                               aria-label="Previous">
                                <span aria-hidden="true"><<</span>
                            </a>
                        </li>
                        {% if data.pages<8 %}
                            {% for i in range(data.pages) %}
                                <li class="page-item"><a
                                        class="page-link {{ 'disabled' if data.page == i + 1 else '' }}"
                                        href="/?s={{ data.s }}&page={{ i + 1 }}">
                                    {{ i + 1 }}</a>
                                </li>
                            {% endfor %}
                        {% elif data.pages>=8 %}
                            {% for i in range(3) %}
                                {% if data.pages - 5 > data.page %}
                                    <li class="page-item"><a
                                            class="page-link {{ 'disabled' if data.page == i + data.page else '' }}"
                                            href="/?s={{ data.s }}&page={{ i + data.page }}">
                                        {{ i + data.page }}</a>
                                    </li>
                                {% else %}
                                    <li class="page-item"><a
                                            class="page-link {{ 'disabled' if data.page == i + data.pages - 5 else '' }}"
                                            href="/?s={{ data.s }}&page={{ data.pages - 5 + i }}">
                                        {{ i + data.pages - 5 }}</a>
                                    </li>
                                {% endif %}
                            {% endfor %}
                            <li class="page-item}">
                                <a class="page-link" href="javascript:(0)">
                                    <span aria-hidden="true">...</span>
                                </a>
                            </li>
                            {% for i in range(3)[::-1] %}
                                <li class="page-item"><a
                                        class="page-link {{ 'disabled' if data.page == data.pages - i else '' }}"
                                        href="/?s={{ data.s }}&page={{ data.pages - i }}">
                                    {{ data.pages - i }}</a>
                                </li>
                            {% endfor %}
                        {% endif %}
                        <li class="page-item {{ 'disabled' if data.page==data.pages else '' }}">
                            <a class="page-link" href="#" aria-label="Next">
                                <span aria-hidden="true">>></span>
                            </a>
                        </li>
                    </ul>
                {% else %}
                    搜索: <span class="text-warning">{{ data.s }}</span> 的结果为空!
                {% endif %}
            </nav>
        </div>
    </div>

{% endblock %}

index.html模板里,加上了没有结果时的代码:

python 复制代码
{% else %}
  搜索: <span class="text-warning">{{ data.s }}</span> 的结果为空!
{% endif %}

把数字放前面,反而可以搜到,不知道翻译是咋翻译的。

相关推荐
lancyu41 分钟前
关于多轮对话机器人的上下文Token优化和解决方案
人工智能·python·深度学习·机器学习·chatgpt·机器人·prompt
草莓橙子碗1 小时前
Claude 使用指南
开发语言·python
工具分享1 小时前
陪跑跟品爆单AI选品助手,高效跟品会赔本吗?
人工智能·python
COOLMO研究AI2 小时前
Python 如何实现 AI API 的提示词(Prompt)版本管理与热更新
人工智能·python·prompt
老郑聊AI业财智造2 小时前
Transformer 技术架构与源码分析
人工智能·python·深度学习·语言模型·架构·transformer·软件工程
程序员三藏2 小时前
自动化测试用例编写详解
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例
230万光年的思念2 小时前
分子动力学模拟参考文献
python
HongXu_CaiYi3 小时前
0103-python相关-函数、文件
python
vortex54 小时前
从Conda到UV:Python项目依赖管理的现代演进
python·conda·uv
何以解忧,唯有..4 小时前
Python time 模块详解:时间处理与日期操作指南
开发语言·python