首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python文章/图像客户机使用请求、pypandoc和os编辑器

Python文章/图像客户机使用请求、pypandoc和os编辑器
EN

Code Review用户
提问于 2018-06-28 09:37:06
回答 1查看 123关注 0票数 4

我的第一次(真的?)程序。

客户端通过发送用户凭据来获取标头的令牌,从而连接到Django restframework。然后,用户可以将图像从OS文件夹拖放到终端中,然后按enter键,然后编写一个标题供其上传。

从服务器获取图像(S) URL,然后将其转化为字节数组中列出的标记。这个字节数组被加载到一个可以用系统的默认编辑器或Vim编辑的tempfile中。当它被保存和关闭时,它被转换成html并发布文章。

api_client.py

代码语言:javascript
复制
import requests
import tempfile
import os
import pypandoc
import json
from getpass import getpass
from subprocess import call

EDITOR = os.environ.get('EDITOR', 'vim')
ARTICLE_URL = 'http://127.0.0.1:8000/api/articles/'
IMAGE_URL = 'http://127.0.0.1:8000/api/media/images/'
TOKEN_URL = 'http://127.0.0.1:8000/api-auth-token/'


def obtain_token(username, password):
    """Authenticate and obtain token"""
    data = {'username': username, 'password': password}
    req = requests.post(TOKEN_URL, data=data)
    res = req.json()
    token = res['token']
    headers = {'Authorization': 'Token {}'.format(token)}
    return headers


"""
Ask for user credentials to set header, not sure how to 
place this code in a functional way
"""
username = input("Username: ")
password = getpass()

headers = obtain_token(username=username, password=password)


def image_upload(img_file, img_title):
    """Upload image with title"""
    files = {'image': img_file}
    payload = {'title': img_title}
    upload = requests.post(IMAGE_URL, files=files, data=payload,
                           headers=headers)
    return upload


md_urls = bytearray()


def img_docload():
    """
    Get the latest uploaded image and convert it
    to a html string so that pypandoc again can make
    it into markdown, then extend each to the bytearray.
    """
    get_url = requests.get(IMAGE_URL)
    get_json = json.loads(get_url.content)
    clean = get_json[-1]['image']
    md_html = ""
    md = pypandoc.convert_text(md_html, 'md', format='html')
    md_urls.extend(md.encode())


def article(headline, summary):
    """
    Make a tempfile and write the list of markdown inserts,
    then open it in Vim or any default editor. Save and quit
    to convert from markdown to html and upload the article.
    """
    with tempfile.NamedTemporaryFile(suffix='.md') as tmp:
        tmp.write(md_urls)
        tmp.flush()
        call([EDITOR, tmp.name])
        tmp.seek(0)
        edited = tmp.read()
        article = edited.decode('utf-8')
        content = pypandoc.convert_text(article, 'html', format='md')
        payload = {
            'headline': headline,
            'summary': summary,
            'content': content,
            }
        upload = requests.post(ARTICLE_URL, json=payload, headers=headers)
        return upload


def main():
    while True:
        action = input("Upload image? (k): ")
        if action == 'k':
            img_file = open(input("Image - Filename: ").strip('\''), 'rb')
            img_title = input("Image - Title: ")
            image_upload(img_file=img_file, img_title=img_title)
            img_docload()
            continue
        else:
            headline = input("Article - Headline: ")
            summary = input("Article - Summary: ")
            article(headline=headline, summary=summary)
            print("Article is published")
            break

main()

问题:

  • 我编写的程序一开始没有一个函数。然后,我试着按照功能设计来学习更多关于功能和如何构造程序的知识。还有什么可以做得更好呢?
  • 您将如何放置obtain_token函数及其I/O?
  • 我的下一个目标是学习类和面向对象程序(OOP);在这个程序中是否存在类的位置,还是没有必要?
  • 您如何看待它首先上传图像,然后获取URL,然后将其放入HTML元素,然后将其转换为md的方式(pypandoc需要它来进行标记,而我希望链接是“动态的”)?这不可能是最好的方法,你会在服务器端做吗?还是最好在客户端做尽可能多的事情?

总的来说,我想知道我犯的所有错误

EN

回答 1

Code Review用户

回答已采纳

发布于 2019-08-27 07:53:05

ARTICLE_URL = 'http://127.0.0.1:8000/api/articles/‘IMAGE_URL = 'http://127.0.0.1:8000/api/media/images/’TOKEN_URL = 'http://127.0.0.1:8000/api-auth-token/

这里的重复可能是有害的。如果您移动服务器,那么有三个地方需要编辑和保持同步。通过减少重复,更容易应对这样的举动:

代码语言:javascript
复制
BASE_URL = 'http://127.0.0.1:8000/api/'
ARTICLE_URL = BASE_URL + 'articles/'
IMAGE_URL = BASE_URL + 'media/images/'
TOKEN_URL = BASE_URL + 'api-auth-token/'

很高兴看到with关键字被有效地使用,以确保资源被正确清理,即使抛出异常;保持好习惯!;-)

main()中,while True具有误导性;实际流程是,我们重复第一个分支多次,然后精确地重复第二个分支一次。我们可以重组循环,使之更加清晰:

代码语言:javascript
复制
def main():
    while input("Upload image? (k): ") == 'k':
        img_file = open(input("Image - Filename: ").strip('\''), 'rb')
        img_title = input("Image - Title: ")
        image_upload(img_file=img_file, img_title=img_title)
        img_docload()

    headline = input("Article - Headline: ")
    summary = input("Article - Summary: ")
    article(headline=headline, summary=summary)
    print("Article is published")

没有continuebreak,就更容易理解控制流;只使用这些关键字作为最后手段!

只有当我们将其作为程序直接执行,而不是将其作为模块导入时,我们才应该运行main()

代码语言:javascript
复制
if __name__ == '__main__':
    main()

我们还需要将用户名/密码请求移动到main()中,我们可能希望将headers作为参数传递,而不是共享全局变量。(我假设在明文中传递密码是一个弱点,这是您所使用的API强加给您的--在设计接口时,绝不能像这样不安全地传递身份验证器!)

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/197406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档