这一篇教程,我们通过URL分发(urls.py)和视图(views.py),做一个有意思的小功能。
通过URL请求中附带参数(问号“?”后方),进行翻译。
如下图所示:
如果想实现翻译功能,我们需要百度翻译的接口,并且通过下方代码实现百度翻译接口的调用。
示例代码:(trans.py)
from urllib.parse import quote from hashlib import md5 from http import client import random import json appid = '通过百度翻译开发者平台申请获取' secret_key = '通过百度翻译开发者平台申请获取' def get_sign(salt, qurey): # 生成调用API的签名 sign = appid + qurey + str(salt) + secret_key m = md5() m.update(sign.encode('utf-8')) return m.hexdigest() def trans(qurey, from_lang='zh', to_lang='en'): # 实现翻译功能 http_client = None salt = random.randint(12345, 67890) sign = get_sign(salt, qurey) myurl = '/api/trans/vip/translate' + '?appid=' + appid + '&q=' + quote( qurey) + '&from=' + from_lang + '&to=' + to_lang + '&salt=' + str(salt) + '&sign=' + sign try: http_client = client.HTTPConnection('api.fanyi.baidu.com') # 连接API http_client.request('GET', myurl) #发起请求 response = http_client.getresponse() #获取响应对象 content = json.loads(response.read()) # 将调用API的返回结果转为字典 return content['trans_result'][0]['dst'] # 返回翻译内容 except Exception as e: return e finally: if http_client: http_client.close()
申请开发者APP ID和密钥流程:
1、进入百度翻译开放平台:http://api.fanyi.baidu.com/api/trans/product/index
2、打开页面后,点击【立即使用】按钮,申请开发者APP ID和密钥。
3、申请成功后,在开发者信息界面中即可看到APP ID和密钥。
当我们完成上方的“trans.py”模块,我们将其放入项目的包(MyWeb)中,并在视图模块(views.py)导入这个模块。
示例代码:
from MyWeb import trans # 导入翻译模块
然后,在视图模块(views.py)中我们添加一个视图函数。
通过request.GET[‘参数名称’]获取URL中的参数值,并调用“trans.py”模块中的trans()函数,返回翻译结果。
特别提醒:一定要注意“request.GET”后面是方括号“[]”。
示例代码:(views.py)
def translate(request): # 定义视图函数 from_lang = request.GET['from_lang'] # 获取URL中的参数 to_lang = request.GET['to_lang'] # 获取URL中的参数 text = request.GET['words'] # 获取URL中的参数 return HttpResponse(trans.trans(text, from_lang, to_lang)) # 返回响应内容对象
接下来,我们再进行URL分发的配置。
打开“urls.py”模块,在urlpatterns列表中添加一个新的配置。
示例代码:(urls.py)
path('trans/', siteviews.translate), # 通过?传递参数进行处理
注意:因为新增加的配置是列表中的一项,代码的末尾要加上英文半角的逗号。
完成这一步之后,我们就可以启动开发服务器(如果忘记了,请参考上一篇教程),并在浏览器中输入URL,查看效果。
例如:http://127.0.0.1:8888/trans/?words=作者是帅哥&from_lang=zh&to_lang=en
这是一种比较常见的URL传递参数的方式,例如百度搜索。
下面,我们再来看一种传递参数的方式。
这种方式不通过问号附带参数,而是以下图这种形式。
在我们之前学习自定义函数时,我们接触过关键字参数和位置参数两种。
如果说上一种附带参数的方式比较像关键字参数的话,当前这一种就比较像位置参数。
当前这种附带参数方式的参数位置都是固定的。
首先,我们还是在视图模块(views.py)中添加一个视图函数。
不过,这一次URL中参数值的获取是直接通过函数的参数进行获取。
示例代码:(views.py)
def translate2(request, words, from_lang, to_lang): # 定义视图函数 return HttpResponse(trans.trans(words, from_lang, to_lang)) # 返回响应内容对象
然后,是URL分发的配置。
打开“urls.py”模块,在urlpatterns列表中添加一个新的配置。
示例代码:(urls.py)
path('trans/<str:from_lang>/<str:to_lang>/<str:words>', siteviews.translate2), # 通过定义url指定部分为参数进行处理
如上方代码所示,我们可以在配置中指定路径中的固定位置为不同的参数。
需要注意的是这里使用的是<类型:参数名称>的格式。
类型会限制参数的输入,共有5种类型:
- int:正整数,包含0。
- str:除路径分隔符“/”之外的非空字符串。
- slug:由字母、数字、横线以及下划线其中一种或多种组成的字符串。
- uuid:通用唯一识别码(Universally Unique Identifier),包含32个16进制数字,以连字号分为五段,形式为8-4-4-4-12的32个字符。
- path:任何非空字符串,包含路径分隔符“/”。
另外,参数名称要和视图函数中的参数名称保持一致。
那么,如下图所示这种URL,如何进行分发?
相信大家很快能得出答案!
示例代码:
path('trans&<str:from_lang>&<str:to_lang>&<str:words>', siteviews.translate2), # 通过定义url指定部分为参数进行处理
最后,我们再来看一种URL分发的配置方法。
这一次的URL如下图所示:
还是使用上一个视图函数,我们在“urls.py”模块中导入一个新的方法。
示例代码:
from django.urls import re_path # 导入通过正则表达式处理路径的方法
然后,在配置中添加一行新的代码。
示例代码:
re_path('trans/(.+)&(.+)-(.+)$', siteviews.translate2), # 通过正则表达式获取url匹配部分为参数进行处理
如上方代码所示,这种方法是通过正则表达式获取路径中的参数,并传递给视图函数进行处理。
需要注意的是URL路径中的参数位置顺序必须与视图中的参数顺序相同。
本节练习源代码:【点此下载】
转载请注明:魔力Python » Django2:Web项目开发入门笔记(4)