给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 %}

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

相关推荐
郭庆汝5 小时前
pytorch、torchvision与python版本对应关系
人工智能·pytorch·python
思则变9 小时前
[Pytest] [Part 2]增加 log功能
开发语言·python·pytest
漫谈网络9 小时前
WebSocket 在前后端的完整使用流程
javascript·python·websocket
try2find10 小时前
安装llama-cpp-python踩坑记
开发语言·python·llama
博观而约取11 小时前
Django ORM 1. 创建模型(Model)
数据库·python·django
精灵vector13 小时前
构建专家级SQL Agent交互
python·aigc·ai编程
Zonda要好好学习13 小时前
Python入门Day2
开发语言·python
Vertira13 小时前
pdf 合并 python实现(已解决)
前端·python·pdf
太凉13 小时前
Python之 sorted() 函数的基本语法
python
项目題供诗13 小时前
黑马python(二十四)
开发语言·python