上一篇博客:Flask之手搓bootstrap翻页-CSDN博客 里,对 OMDb API - The Open Movie Database 的搜索,只能使用英文,才能搜索出电影信息,如果使用中文,是搜索不到结果的。这里就需要使用翻译,把中文电影名翻译成英文电影名。
这里使用百度翻译,百度翻译量少的话是免费的,百度翻译开放平台,而且有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 documentimport 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 + pathquery = '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
from flask import Flask, render_template, request
import requests
import math
import json
import random
from hashlib import md5app = 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 = 1else: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 = 0data = 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 = 1rawData = 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 = 0data = 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 signdef 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 requestheaders = {'Content-Type': 'application/x-www-form-urlencoded'}payload = {'appid': appid, 'q': query, 'from': from_lang, 'to': to_lang, 'salt': salt, 'sign': sign}# Send requestr = 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"]) # supermanreturn 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
<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
<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
<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
<!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
{% 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
{% 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"><aclass="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"><aclass="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"><aclass="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"><aclass="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模板里,加上了没有结果时的代码:
{% else %}搜索: <span class="text-warning">{{ data.s }}</span> 的结果为空!
{% endif %}
把数字放前面,反而可以搜到,不知道翻译是咋翻译的。