最新消息:欢迎光临 魔力 • Python!大家可以点开导航菜单中的【学习目录】,这个目录类似图书目录,更加方便学习!

Django2:Web项目开发入门笔记(4)

Django教程 小楼一夜听春语 10092浏览 0评论

这一篇教程,我们通过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)

头像
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网站 (可选)

网友最新评论 (11)

  1. 头像
    给个大大的赞,支持楼主
    AAA7年前 (2018-03-07)回复
  2. 头像
    楼主大大,我跟着做了,后回结果是:'trans_result',没有正常翻译
    linxs7年前 (2018-03-20)回复
    • 小楼一夜听春语
      你可以复制源代码到自己的项目运行看看,然后自己进行对比,哪里有区别。
      小楼一夜听春语7年前 (2018-03-21)回复
      • 头像
        为什么我用自己的id就是显示'trans_result',用你的id就是正确结果?
        lodgeinwh7年前 (2018-06-22)回复
      • 头像
        明白了,是我没开通基础翻译的权限,现在开通了就好了
        lodgeinwh7年前 (2018-06-22)回复
  3. 头像
    挺有意思的,虽然不是很明白,结果跑出来了。 🙄
    走路爱走神7年前 (2018-06-01)回复
  4. 头像
    trans.py中 json.loads(response.read()后面要跟上 .decode('utf-8')
    alfred37年前 (2018-06-10)回复
  5. 头像
    request.GET[‘参数名称’]获取URL中的参数值,如果url中这个参数不存在时,就报错,如何处理参数不存在情况?
    蜗牛6年前 (2018-09-22)回复
    • 小楼一夜听春语
      request.GET.get('key',default)
      小楼一夜听春语6年前 (2018-09-25)回复
  6. 头像
    但是作者url路径中的参数位置顺序和视图中的顺序是不一致的,一个是to_lang 在最前面, 一个是words在最前面
    再听风吟6年前 (2019-01-03)回复
    • 小楼一夜听春语
      按参数名称取值,无关顺序。
      小楼一夜听春语6年前 (2019-01-04)回复