精华内容
下载资源
问答
  • [python]python web开发系统架构

    千次阅读 2016-04-27 14:40:43
    Python Web开发的世界里框架横行...本文首先分析Python Web开发中常用系统架构,然后对WSGI协议内容进行了简单结算,接着基于WSGI协议编写了一个简单的Python Web框架,最后以Django为例分析处理Web请求的基本流程。

    在Python Web开发的世界里框架横行,但是不论是Django、Webpy、Bottlepy还是Tornado他们在处理Web请求时都有着相同的处理机制,即都要遵循WSGI协议的标准。本文首先分析Python Web开发中常用系统架构,然后对WSGI协议内容进行了简单结算,接着基于WSGI协议编写了一个简单的Python Web框架,最后以Django为例分析处理Web请求的基本流程。

    Python Web开发系统架构

    Python Web 开发中,服务端程序可以分为两个部分,一是服务器程序,二是应用程序。前者负责把客户端请求接收,整理,后者负责具体的逻辑处理。为了方便应用程序的开发,我们把常用的功能封装起来,成为各种Web开发框架,例如 Django, Flask, Tornado。不同的框架有不同的开发方式,但是无论如何,开发出的应用程序都要和服务器程序配合,才能为用户提供服务。这样,服务器程序就需要为不同的框架提供不同的支持。这样混乱的局面无论对于服务器还是框架,都是不好的。对服务器来说,需要支持各种不同框架,对框架来说,只有支持它的服务器才能被开发出的应用使用。

    这时候,标准化就变得尤为重要。我们可以设立一个标准,只要服务器程序支持这个标准,框架也支持这个标准,那么他们就可以配合使用。一旦标准确定,双方各自实现。这样,服务器可以支持更多支持标准的框架,框架也可以使用更多支持标准的服务器。

    Python Web开发中,这个标准就是 Python Web Server Gateway Interface, 即 WSGI。WSGI是作为Web服务器与Web应用程序或应用框架之间的一种低级别的接口,它是基于现存的CGI标准而设计的。WSGI将 Web 组件分为三类: Web服务器,Web中间件,Web应用程序, WSGI基本处理模式为 :

    WSGI Server -> (WSGI Middleware)* -> WSGI Application

    Python处理Web请求流程分析 - 第1张  | Eureka

    WSGI概述

    WSGI Application

    WSGI规定:

    1. 应用程序需要是一个可调用的对象

    在Python中:

    • 可以是函数
    • 可以是一个实例,它的类实现了__call__方法
    • 可以是一个类,这时候,用这个类生成实例的过程就相当于调用这个类

    同时,WSGI规定:

    2. 可调用对象接收两个参数

    这样,如果这个对象是函数的话,它看起来要是这个样子:

    如果这个对象是一个类的话,它看起来是这个样子:

    如果这个对象是一个类的实例,那么,这个类看起来是这个样子:

    最后,WSGI还规定:

    3.可调用对象要返回一个值,这个值是可迭代的。

    这样的话,前面的三个例子就变成:

    你可能会说,不是啊,我们平时写的web程序不是这样啊。 比如如果使用web.py框架的话,一个典型的应用可能是这样的:

    这是由于框架已经把WSGI中规定的一些东西封装起来了,我们平时用框架时,看不到这些东西,只需要直接实现我们的逻辑,再返回一个值就好了。其它的东西框架帮我们做好了。这也是框架的价值所在,把常用的东西封装起来,让使用者只需要关注最重要的东西。

    当然,WSGI关于应用程序的规定不只这些,但是现在,我们只需要知道这些就足够了。

    WSGI Server/Gateway

    服务器程序会在每次客户端的请求传来时,调用我们写好的应用程序,并将处理好的结果返回给客户端。

    4.服务器程序需要调用应用程序

    服务器程序看起来大概是这个样子的:

    这里可以看出服务器程序是如何与应用程序配合完成用户请求的。

    WSGI规定了应用程序需要一个可调用对象,有两个参数,返回一个可迭代对象。在服务器 程序中,针对这几个规定,做了以下几件事:

    • 把应用程序需要的两个参数设置好
    • 调用应用程序
    • 迭代访问应用程序的返回结果,并将其传回客户端

    你可以从中发现,应用程序需要的两个参数,一个是一个dict对象,一个是函数。

    middleware

    另外,有些功能可能介于服务器程序和应用程序之间,例如,服务器拿到了客户端请求的URL, 不同的URL需要交由不同的函数处理,这个功能叫做 URL Routing,这个功能就可以放在二者中间实现,这个中间层就是 middleware。

    middleware对服务器程序和应用是透明的,也就是说,服务器程序以为它就是应用程序,而应用程序以为它就是服务器。这就告诉我们,middleware需要把自己伪装成一个服务器,接受应用程序,调用它,同时middleware还需要把自己伪装成一个应用程序,传给服务器程序。

    其实无论是服务器程序,middleware 还是应用程序,都在服务端,为客户端提供服务,之所以把他们抽象成不同层,就是为了控制复杂度,使得每一次都不太复杂,各司其职。

    下面,我们看看middleware大概是什么样子的。

    函数 midware_app就是一个简单的middleware:对服务器而言,它是一个应用程序,是一个可调用对象, 有两个参数,返回一个可调用对象。对应用程序而言,它是一个服务器,为应用程序提供了参数,并且调用了应用程序。

    另外,这里的urlrouting函数,相当于一个函数生成器,你给它不同的 url-app 映射关系,它会生成相应的具有 url routing功能的 middleware。

    编写符合WSGI协议的Python框架

    WSGI Application就是一个普通的Callable对象,当有请求到来时,WSGI Server会调用这个WSGI Application。这个对象接收两个参数,通常为environ,start_response。environ可以理解为环境变量,跟一次请求相关的所有信息都保存在了这个环境变量中,包括服务器信息,客户端信息,请求信息。start_response是一个callback函数,WSGI Application通过调用start_response,将Response Headers/Status 返回给WSGI Server。此外这个WSGI Application会返回一个iterator对象 ,这个iterator就是Response Body。

    下面这个例子是一个最简单的WSGI Application,引自http://www.python.org/dev/peps/pep-3333/

    WSGI Server可以理解为一个符合WSGI规范的Webserver,接收Request请求,封装一系列环境变量,按照WSGI规范调用注册的WSGI Application,最后将Response返回给客户端。以python自带的wsgiref为例,wsgiref是按照WSGI规范实现的一个简单WSGI Server。

    WSGI Server基本工作流程

    1. 服务器创建socket,监听端口,等待客户端连接。
    2. 当有请求来时,服务器解析客户端信息放到环境变量environ中,并调用绑定的handler来处理请求。
    3. handler解析这个http请求,将请求信息例如method,path等放到environ中。
    4. wsgi handler再将一些服务器端信息也放到environ中,最后服务器信息,客户端信息,本次请求信息全部都保存到了环境变量environ中。
    5. wsgi handler 调用注册的wsgi app,并将environ和回调函数传给wsgi app
    6. wsgi app 将reponse header/status/body 回传给wsgi handler
    7. 最终handler还是通过socket将response信息塞回给客户端。

    结合服务器和应用程序可以得到一个实例

    上面的application看起来没什么意思,感觉没有太大用,但加上一层层的middleware包装之后就不一样了。

    上面的例子可以看出来,middleware 包装之后,一个简单wsgi app就有了URL dispatch功能。然后我还可以在这个app外面再加上其它的middleware来包装它,例如加一个权限认证的middleware:

    经过这些middleware的包装,已经有点框架的感觉了。其实基于wsgi的框架,例如paste,pylons就是这样通过一层层middleware组合起来的。只是一个成熟的框架,这样的middleware会有很多,例如:

    同时我们对Application进行改造,抽象出一个简单的框架:

    • 剥离出其中的具体处理细节:urls配置 和 web处理逻辑(改成在多个类中实现相应的GET方法)
    • 把方法header实现为类方法(classmethod),以方便外部作为功能函数调用
    • 改用 具有 __call__ 方法的 实例 来实现application

    形成框架文件framework.py

    相应的应用程序文件code.py:

    Django处理Web请求基本流程

    Django和其他Web框架一样,HTTP的处理流程基本类似:接受request,返回response内容。Django的具体处理流程大致如下:

    加载project settings

    在通过django-admin.py创建project的时候,Django会自动生成默认的settings文件和manager.py等文件,在创建WSGIServer之前会执行下面的引用:

    上面引用在执行时,会读取os.environ中的DJANGO_SETTINGS_MODULE配置,加载项目配置文件,生成settings对象。所以,在manager.py文件中你可以看到,在获取WSGIServer之前,会先将project的settings路径加到os路径中。

    创建WSGIServer

    不管是使用runserver还是uWSGI运行Django项目,在启动时都会调用django.core.servers.basehttp中的run()方法,创建一个django.core.servers.basehttp.WSGIServer类的实例,之后调用其serve_forever()方法启动HTTP服务。run方法的源码如下:

    如上,我们可以看到:在创建WSGIServer实例的时候会指定HTTP请求的Handler,上述代码使用WSGIRequestHandler。当用户的HTTP请求到达服务器时,WSGIServer会创建WSGIRequestHandler实例,使用其handler方法来处理HTTP请求(其实最终是调用wsgiref.handlers.BaseHandler中的run方法处理)。WSGIServer通过set_app方法设置一个可调用(callable)的对象作为application,上面提到的handler方法最终会调用设置的application处理request,并返回response。

    其中,WSGIServer继承自wsgiref.simple_server.WSGIServer,而WSGIRequestHandler继承自wsgiref.simple_server.WSGIRequestHandler,wsgiref是Python标准库给出的WSGI的参考实现。其源码可自行到wsgiref参看,这里不再细说。

    处理Request

    第二步中说到的application,在Django中一般是django.core.handlers.wsgi.WSGIHandler对象,WSGIHandler继承自django.core.handlers.base.BaseHandler,这个是Django处理request的核心逻辑,它会创建一个WSGIRequest实例,而WSGIRequest是从http.HttpRequest继承而来

    返回Response

    上面提到的BaseHandler中有个get_response方法,该方法会先加载Django项目的ROOT_URLCONF,然后根据url规则找到对应的view方法(类),view逻辑会根据request实例生成并返回具体的response。

    在Django返回结果之后,第二步中提到wsgiref.handlers.BaseHandler.run方法会调用finish_response结束请求,并将内容返回给用户。

    Django在处理request的时候其实做了很多事情,下面两张Django流程图能基本说明问题。

    Python处理Web请求流程分析 - 第2张  | Eureka  Python处理Web请求流程分析 - 第3张  | Eureka

    • 1. 用户通过浏览器请求一个页面
    • 2. 请求到达Request Middlewares,中间件对request做一些预处理或者直接response请求
    • 3. URLConf通过urls.py文件和请求的URL找到相应的View
    • 4. View Middlewares被访问,它同样可以对request做一些处理或者直接返回response
    • 5. 调用View中的函数
    • 6. View中的方法可以选择性的通过Models访问底层的数据
    • 7. 所有的Model-to-DB的交互都是通过manager完成的
    • 8. 如果需要,Views可以使用一个特殊的Context
    • 9. Context被传给Template用来生成页面
    • a. Template使用Filters和Tags去渲染输出
    • b. 输出被返回到View
    • c. HTTPResponse被发送到Response Middlewares
    • d. 任何Response Middlewares都可以丰富response或者返回一个完全不同的response
    • e. Response返回到浏览器,呈现给用户

    上述流程中最主要的几个部分分别是:Middleware(中间件,包括request, view, exception, response),URLConf(url映射关系),Template(模板系统),下面一一介绍一下。

    Middleware(中间件)

    Middleware并不是Django所独有的东西,在其他的Web框架中也有这种概念。在Django中,Middleware可以渗入处理流程的四个阶段:request,view,response和exception,相应的,在每个Middleware类中都有process_request,process_view, process_response 和 process_exception这四个方法。你可以定义其中任意一个活多个方法,这取决于你希望该Middleware作用于哪个处理阶段。每个方法都可以直接返回response对象。

    Middleware是在Django BaseHandler的load_middleware方法执行时加载的,加载之后会建立四个列表作为处理器的实例变量:

    • _request_middleware:process_request方法的列表
    • _view_middleware:process_view方法的列表
    • _response_middleware:process_response方法的列表
    • _exception_middleware:process_exception方法的列表

    Django的中间件是在其配置文件(settings.py)的MIDDLEWARE_CLASSES元组中定义的。在MIDDLEWARE_CLASSES中,中间件组件用字符串表示:指向中间件类名的完整Python路径。

    URLConf(URL映射)

    如果处理request的中间件都没有直接返回response,那么Django会去解析用户请求的URL。URLconf就是Django所支撑网站的目录。它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表。通过这种方式可以告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。具体的,在Django项目的配置文件中有ROOT_URLCONF常量,这个常量加上根目录”/”,作为参数来创建django.core.urlresolvers.RegexURLResolver的实例,然后通过它的resolve方法解析用户请求的URL,找到第一个匹配的view。

    其他有关URLConf的内容,这里不再具体介绍,大家可以看DjangoBook了解。

    Template(模板)

    大部分web框架都有自己的Template(模板)系统,Django也是。但是,Django模板不同于Mako模板和jinja2模板,在Django模板不能直接写Python代码,只能通过额外的定义filter和template tag实现。由于本文主要介绍Django流程,模板内容就不过多介绍。

    参考文献

    (1)on_1y,《WSGI 简介》:http://blog.csdn.net/on_1y/article/details/18803563

    (2)kenshinx,《Wsgi研究》:http://blog.kenshinx.me/blog/wsgi-research/

    (3)russellluo,《用Python写一个简单的Web框架》:http://www.cnblogs.com/russellluo/p/3338616.html
    (4)tenking,《Django 结构及处理流程分析》:http://my.oschina.net/tenking/blog/29439

    展开全文
  • Python 如何开发一个ATM系统

    万次阅读 2019-08-06 19:08:10
    如何用Python开发一个ATM系统 python 有着易于阅读,易于维护的特点,有丰富的第三方库。用一门语言来开发ATM系统并不简单,但是当你用上了有着丰富的第三方库的python的时候,也许你可以从容面对。 分析系统...

    在这里插入图片描述

    如何用Python来开发一个ATM系统

    python 有着易于阅读,易于维护的特点,有丰富的第三方库。用一门语言来开发ATM系统并不简单,但是当你用上了有着丰富的第三方库的python的时候,也许你可以从容面对。

    分析系统蓝图

    开发一个ATM系统是面向用户的,我们首先将这个ATM系统跟用户的关系表现出来。首先我们画出用例图。
    ATM用例图
    这个时候我们把思维理顺了,可以开始写代码了。

    我们先定义一个用户类

    用户类来记录用户的姓名、身份证号、电话号码、银行卡

    class User:
    
        def __init__(self, name, idcard, phonenum, card):
            self.name = name
            self.idcard = idcard
            self.phonenum = phonenum
            self.card = card
    
    然后定义一个卡类

    卡类是用来记录银行卡的卡号、密码、存储的金额、是否被冻结的状态

    class Card:
        def __init__(self, cardnum, password, money, islock=False):
            self.cardnum = cardnum
            self.password = password
            self.money = money
            self.islock = islock

    完成了用户和银行卡的类定义,我们还只是完成了一小步。

    定义一个ATM类

    我们几乎所有的事情要在ATM类中完成,登陆、开户、查询、取款等等,这些都要在ATM中完成,所以编写ATM类这是非常重要也是最难写的。不过也不要着急,我们一步一步来完善ATM的功能。

    首先我们导入用户模块和银行卡模块,还有随机数模块,我们要用它来生成用户的银行卡号。

    import random
    import time
    from card import Card
    from user import User

    然后把类的大致框架写出来,定义一个用来存储所有信息的字典。

    class ATM:
    
        userDict = dict()
        islogin = None

    ATM系统欢迎界面很容易写出来

    @staticmethod
    def welcome():
        print('''
           **********************
           *                    *
           *  welcome to bank   *
           *                    *
           **********************
           ''')
    
    @staticmethod
    def select():
        print('''
           **********************
           *  1.登陆   2.开户    *
           *  3.查询   4.取款    *
           *  5.存款   0.退出    *
           *  6.转账   7.改密    *
           *  8.锁卡   9.解锁    *
           **********************
           ''')
        num = input("请选择服务项目:")
        return num

    定义函数来获取银行卡的卡号,银行卡的卡号是随机的

    @classmethod
    def getcardnum(cls):
        while True:
            cardnum = str()
            for x in range(6):
                cardnum += str(random.randrange(0, 10))
            if cardnum not in cls.userDict:
                return cardnum

    如果是新用户的话,需要开户

    @classmethod  
    def openuser(cls):
        name = input("请输入您的姓名:")
        idcard = input("请输入您的身份证号码:")
        phonenum = input("请输入您的电话号码:")
        psd = input("请设置您的密码:")
        psd2 = input("请确认您的密码:")
        if psd == psd2:
            money = int(input("请输入您的预存金额:"))
            if money > 0:
                cardnum = cls.getcardnum()
                card = Card(cardnum, psd, money)
                user = User(name, idcard, phonenum, card)
                cls.userDict[cardnum] = user
                print("开卡成功!您的卡号为%s,请牢记..." % cardnum)
            else:
                print("预存金额非法,开卡失败!")
    
        else:
            print("两次输入密码不一致,开卡失败!")

    登录函数,这里要注意在开始输入卡号之后,要先判断此卡号是否已经被冻结。如果已经冻结,则无法登录。登录成功,在这里就要把我们定义的islogin赋值为True,因为查询、取款、存款、转账、改密操作我们要先判断是否已经登录。

    @classmethod
    def login(cls):
        cardnum = input("请输入你的卡号:")
        user = cls.userDict.get(cardnum)
    
        if user:
            if user.card.islock:
                print("您的卡片已经被锁!")
                return
    
            else:
                a = 0
                while a < 3:
                    psd = input("请输入您的密码:")
                    if psd == user.card.password:
                        print("登陆成功!")
                        cls.islogin = cardnum
                        break
                    else:
                        print("密码错误,登陆失败!")
                        a += 1
                if a == 3:
                    user.card.islock = True
                    print("您的卡片已经被冻结!")
        else:
            print("卡号不存在")

    查询

    @classmethod
    def search(cls):
        if cls.islogin:
            print("您当前的余额为%d元" % cls.userDict.get(cls.islogin).card.money)
        else:
            print("请登录后查询!")

    取款

    @classmethod
    def withdrawals(cls):
        if cls.islogin:
            print("您当前的余额为%d元" % cls.userDict.get(cls.islogin).card.money)
            rmoney = int(input("输入您想提取的金额:"))
            if rmoney <= cls.userDict.get(cls.islogin).card.money:
                cls.userDict.get(cls.islogin).card.money -= rmoney
                print("取款中,请稍后...")
                time.sleep(1)
                print("成功提取%d元!" % rmoney)
                print("您当前的余额为%d元!" % cls.userDict.get(cls.islogin).card.money)
                return
            else:
                print("您的余额不足%d元,请重新输入!" % rmoney)
        else:
            print("请登录后取款!")

    存款

    @classmethod
    def deposit(cls):
        if cls.islogin:
            addmoney = int(input("请您放入钞票:"))
            cls.userDict.get(cls.islogin).card.money += addmoney
            print("存款中,请稍后...")
            print("您本次存入的金额为:%d元" % addmoney)
            print("您的余额为%d元" % cls.userDict.get(cls.islogin).card.money)
        else:
            print("请登录后存款!")

    更改密码

    @classmethod
    def changepassword(cls):
        if cls.islogin:
            newpsd1 = input("请输入您的新密码:")
            newpsd2 = input("请再次输入您的新密码:")
            if newpsd1 == newpsd2:
                cls.userDict.get(cls.islogin).card.password = newpsd2
                print("更改密码成功!")
            else:
                print("两次输入密码不一致,更改密码失败!")
        else:
            print("您还未登录,请登陆后更改密码!")

    冻结银行卡

    @classmethod
    def lock(cls):
        if cls.islogin:
            cls.userDict.get(cls.islogin).card.islock = True
            print("您的卡片已经成功冻结!")
            cls.islogin = None
    
        else:
            print("您还未登录,请登陆后进行操作!")

    解冻银行卡

    @classmethod
    def unlock(cls):
        cardnum = input("请输入你的卡号:")
        user = cls.userDict.get(cardnum)
        if user:
            psd = input("请输入您的密码:")
            if psd == user.card.password:
                user.card.islock = False
                print("卡片解锁成功!")
                cls.islogin = cardnum
            else:
                print("密码错误,登陆失败!")
        else:
            print("卡号不存在")
    

    转账

    @classmethod
    def transfer(cls):
        if cls.islogin:
            receive = input("请输入接受账号:")
            a = cls.userDict.get(receive)
            if a:
                tmoney = int(input("请输入您转账的金额:"))
                if tmoney <= cls.userDict.get(cls.islogin).card.money:
                    cls.userDict.get(cls.islogin).card.money -= tmoney
                    cls.userDict.get(receive).card.money += tmoney
                    print("成功转账%d元到%s" % (tmoney, receive))
                else:
                    print("您的余额不足%d元!" % tmoney)
    
            else:
                print("账号不存在!")
        else:
            print("您还未登陆,请登录后进行操作!")

    好了,到这里ATM系统基本完成了。只要调用ATM类就可以完成所有操作。

    from atm import ATM
    import time
    import json
    from card import Card
    from user import User
    
    
    def main():
        ATM.welcome()
    
        while True:
            time.sleep(0.2)
            num = ATM.select()
            if num == '1':
                print("登陆!")
                ATM.login()
            elif num == '2':
                print("开户!")
                ATM.openuser()
            elif num == '3':
                print("查询!")
                ATM.search()
            elif num == '4':
                print("取款!")
                ATM.withdrawals()
            elif num == '5':
                print("存款!")
                ATM.deposit()
            elif num == '6':
                print("转账!")
                ATM.transfer()
            elif num == '7':
                print("更改密码!")
                ATM.changepassword()
            elif num == '8':
                print("冻结卡片!")
                ATM.lock()
            elif num == '9':
                print("解冻卡片")
                ATM.unlock()
            elif num == '0':
                print("已退出!")
                print("请及时取走您的卡片!")
                        break
            else:
                print("选择有误,请重新输入!")
    
    
    if __name__ == '__main__':
        main()

    但是我们并不只限于此,ATM系统虽然可以实习所有的操作,但是如果我们退出系统之后,数据去没有保存下来。因此,需要将数据序列化保存到磁盘中,同样,也需要将磁盘中的数据反序列化变成对象。

    from atm import ATM
    import time
    import json
    from card import Card
    from user import User
    
    
    def user2dict(user):
        """序列化"""
        return {'name': user.name,
                'idcard': user.idcard,
                'phonenum': user.phonenum,
                'card': {'cardnum': user.card.cardnum,
                         'password': user.card.password,
                         'money': user.card.money,
                         'islock': user.card.islock}}
    
    
    def dict2user(d):
        """反序列化"""
        return User(d['name'],
                    d['idcard'],
                    d['phonenum'],
                    Card(d['card']['cardnum'],
                         d['card']['password'],
                         d['card']['money'],
                         d['card']['islock']))
    
    
    def main():
        ATM.welcome()
        # noinspection PyBroadException
        try:
            # with open('use.txt', 'rb') as f:
            #     ATM.userDict = pickle.load(f)
            with open('use.txt', 'r', encoding='utf-8') as f:
                for line in f.readlines():
                    userdict = json.loads(line)
                    user = dict2user(userdict)
                    ATM.userDict[user.card.cardnum] = user
        except BaseException:
            pass
        while True:
            time.sleep(0.2)
            num = ATM.select()
            if num == '1':
                print("登陆!")
                ATM.login()
            elif num == '2':
                print("开户!")
                ATM.openuser()
            elif num == '3':
                print("查询!")
                ATM.search()
            elif num == '4':
                print("取款!")
                ATM.withdrawals()
            elif num == '5':
                print("存款!")
                ATM.deposit()
            elif num == '6':
                print("转账!")
                ATM.transfer()
            elif num == '7':
                print("更改密码!")
                ATM.changepassword()
            elif num == '8':
                print("冻结卡片!")
                ATM.lock()
            elif num == '9':
                print("解冻卡片")
                ATM.unlock()
            elif num == '0':
                print("已退出!")
                print("请及时取走您的卡片!")
                with open('use.txt', 'w', encoding='utf-8') as f2:
                    for user in ATM.userDict.values():
                        userstr = json.dumps(user, default=user2dict)
                        f2.write(userstr+'\n')
                break
            else:
                print("选择有误,请重新输入!")
    
    
    if __name__ == '__main__':
        main()

    接下来看一下最终得成果

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 从事嵌入式系统软硬件设计工作已有将尽20年的时间,在进行硬件目标板调试时,常...本系列教程将从基于硬件的上位机软件设计的角度着手,系统介绍Python语言,希望读者通过本系列教程的学习,能够对Python语言立刻学...


    一、Visual Studio Code简介

    Microsoft在2015年4月30日Build 开发者大会上正式宣布了 Visual Studio Code 项目:一个运行于 Mac OS X、Windows和 Linux 之上的,针对于编写现代 Web 和云应用的跨平台源代码编辑器。其标志着微软公司第一次向开发者们提供了一款真正的跨平台编辑器。虽然完整版的 Visual Studio 仍然是只能运行在 Windows 和 macOS(Mac OS X )之上,但是这一次的声明向我们展示了微软公司对于支持其他计算机平台的承诺。以下是Visual Studio Code的过人之处:

    1、快速强大的编码功能:能够快速捕捉程序中的问题并突出显示。支持多光标编辑,参数提示以及其他快速编码特性。

    2、IntelliSense功能:根据文档上下文为变量类型、函数定义和导入模块提供代码智能补全功能。

    3、代码导航和重构:使用peek和navigate to definition功能可以查阅浏览你的源代码,代码重构变得轻而易举。

    4、整合Git支持:支持使用Git来加速你的代码发行周期。可以直观地回顾代码更改过程并在Visual Studio Code中即时提交而无需分散精力去专门提交。

    5、集成调试功能:断点停止,检查与监视变量, 利用交互式解释器和悬停来检查上下文变量。

    6、易于扩展:使用集成的扩展库市场定制你自己的工具。只需鼠标单击几下便可以为Visual Studio Code额外添加丰富的语言支持。

    二、Visual Studio Code的下载

    我们从官方网站进行Visual Studio Code的下载,下载网址为:https://code.visualstudio.com/Download。如下图所示,如果我们使用的是Windows版本,则有2个版本提供下载,一个是用户版,另一个系统管理员版本,为了今后使用的方便,建议下载系统管理员版本。

    2、点击下载后,会出现下载页面,程序很小,稍等即可。

    三、Visual Studio Code的安装

    1、双击下载的安装文件即可进行Visual Studio Code的安装,欢迎界面如下图所示,我们点击“下一步”。

    2、在出现的如下图所示的界面中,我们选择“我接受协议”,然后点击“下一步”。

     3、接下来选择安装路径,路径一定要设置合理,如下图所示。

    4、下面设置开始菜单中,文件夹的名称,我们选择默认设置即可。

    5、在下图所示的界面中,我们根据自己的需要进行设置即可。

    6、在下图所示的界面中,我们仔细确认一下,如果没有问题,点击“安装”按钮,即可进行软件的安装了。

    7、在后续出现的界面中,我们只需等待即可。

     8、软件安装的会很快,安装完毕后,出现如下图所示的界面,我们点击完成即可。

     四、Visual Studio Code界面的配置

    Visual Studio Code安装完毕后,默认是深色界面主题,可通过以下方法进行更改。

    1、“文件”-“首选项”-“颜色主题”。

    2、下图安装完成后,缺省的主题界面,我们双击既可以进行选择。

    五、配置Python环境

    我们可以通过下图所示的方法,安装Python插件。

    安装完成后,需要重新进行加载,如下图所示。

    六、“创世纪”——最简单的程序

    按照下列步骤,完成我们第1个程序。

    1、在计算机中建立文件夹,例如ex01,Python是以文件夹来建立项目的。

    2、在Visual Studio Code中,打开该文件夹,使用的命令是“文件”——“打开文件夹”。

    3、打开后,如下图所示。

     4、点击“新建文件”,即可建立程序文件,如下图所示。

    5、我们可以起名为ex01.py。

    6、Visual Studio Code会自动根据扩展名选择相应的程序设计语言,如果不正确,可以在编辑环境的右下角进行更改。

    7、输入程序,如下图所示。

    8、按F5即可调试运行程序,如下图所示。

     

    到此,Python的基本开发环境,我们已经建立完毕了,随着学习的深入,我们还会介绍PyQT、PyGame等环境的配置。现在让我们放慢脚步,遥看一下窗外的夜景,一切随缘...

     

    任何问题,只需在此文章的评论处留言即可,我将尽力解答,不要试图采用其它的联系方式,我一概不理会。

    原创性文章,转载请注明出处CSDN:http://blog.csdn.net/qingwufeiyang12346。

     

     

     

    展开全文
  • python开发信息管理系统

    千次阅读 2019-04-20 14:23:26
    python开发信息管理系统 python解释器版本:python3.7.0 开发环境:win7(64位) # _*_ coding:utf-8 _*_ # 开发时间:2019/4/18 19:59 # 文件名称:tool.py # 开发工具:PyCharm card_list = [] #定义信息列表 def ...

    python开发信息管理系统
    python解释器版本:python3.7.0
    开发环境:win7(64位)

    # _*_ coding:utf-8 _*_
    # 开发时间:2019/4/18 19:59
    # 文件名称:tool.py
    # 开发工具:PyCharm
    card_list = []      #定义信息列表
    def shown_menu():
        print("*"*80)
        print("1、新建名片\n2、显示全部\n3、查询名片\n\n4、退出系统")
        print("*"*80)
    def new_card():
        #新增名片
        print("-"*80)
        print("新增信息")
        #1、提示输入信息
        name_str = input("请输入姓名:")
        phone_str = input("请输入电话号码:")
        qq_str = input("请输入邮箱:")
    
        #2、使用输入建立信息字典
        card_dict = {"name": name_str,
                     "phone": phone_str,
                     "email": qq_str,
                     }
        #3、将信息字典添加到列表之中
        card_list.append(card_dict)
        print(card_list)
        #4、提示添加成功
        print("%s信息添加成功" %name_str)
    def shown_all():
        """
        显示全部
        :return: 
        """
        print("-" * 80)
        print("显示所有")
    
        if len(card_list) == 0:
            print("无记录")
            return
        #1、打印表头
        for name in ["姓名","电话","邮箱"]:
            print(name.ljust(20),end="\t")
        print("")
        print("=" * 80)
        for card_dict in card_list:
            print("%s\t%s\t%s\t"
                  %((card_dict["name"]).ljust(20),
                    (card_dict["phone"]).ljust(20),
                    (card_dict["email"]).ljust(20)))
    
    
    
    def search_card():
        """
        查找名片
        :return: 
        """
        print("-" * 80)
        print("查找信息")
        #接收输入
        find_name = input("请输入姓名:")
        # 遍历card_list,查询信息
        for card_dict in card_list:
            if card_dict["name"] == find_name:
                for name in ["姓名", "电话", "邮箱"]:
                    print(name.ljust(20), end="\t")
                print("")
                print("%s\t%s\t%s\t"
                      % ((card_dict["name"]).ljust(20),
                         (card_dict["phone"]).ljust(20),
                         (card_dict["email"]).ljust(20)))
                break
            else:
                print("non")
    

    以上是定义的功能模块

    import tool
    while 1:
        tool.shown_menu()
        action = int(input("请输入功能选择:"))
        print("选择的操作是:%d" %action)
    
        if action == 1:
            tool.new_card()
    
        elif action == 2:
            tool.shown_all()
    
        elif action == 3:
            tool.search_card()
    
        elif action == 0:
            print("退出系统\n")
            break
        else:
            print("输入错误,请重新输入\n")
    

    以上是主程序单元

    本人是python的初学者,发文记录学习日记,代码经供参考,不用于其他用途

    展开全文
  • 主要介绍Django开发,根据第三方库内容特点,课程共分6个内容模块和1个实战模块: 模块1:Django开发Hello World网站,HTML、CSS初步 模块2:Django开发简单的云端管理平台 模块3:网络服务开发入门,AJAX和JSON ...
  • 本篇博客分享如何在Mac OSX系统中搭建Python集成开发环境 首先到Python官网下载pythonpython官网链接 这里选择下载Python2.7.9版本,下载完成之后安装: 安装成功,打开终端: 下面下载python开发的ide,...
  • 这是我整理的北京理工大学嵩天老师python云端系统开发(Django)MOOC的笔记汇总目录 python云端系统开发(Django)MOOC笔记整理week1 python云端系统开发(Django)MOOC笔记整理week2(A)Django框架的最小程序 ...
  • 2.1.1 系统开发环境介绍 当前程序是以python为编程语言,主要功能实现依赖于pygame模块,主要用到surface对象之间的位置变化,再利用事件监听让程序运行起来。运行中Surface对象的位置发生变化后,界面刷新,用户对...
  • Python语言系统学习3:构建Python开发环境

    千次阅读 多人点赞 2019-02-27 23:36:15
    从事嵌入式系统软硬件设计工作已有将尽20年的时间,在进行硬件目标板调试时,常...本系列教程将从基于硬件的上位机软件设计的角度着手,系统介绍Python语言,希望读者通过本系列教程的学习,能够对Python语言立刻学...
  • Mac系统自带python开发环境,我们可以在terminal终端输入python开启Python IDLE开发环境。注意,若自己以前未安装Python的其他版本,则默认打开的是Python 2.7版本 我们在开发中使用较多的是Python3版本,因此,...
  • 二、贴近实战 本系列课程为练手项目实战:学生管理系统开发,项目包含了如下几个内容:项目的总体介绍、项目的数据库、连接数据库的类、实现学生信息的增删改查、项目总结及优化方案。课程具有极强的实战性。
  • python项目之博客系统开发

    千人学习 2017-03-06 10:04:08
    系统由于主站、个人博客、后台管理三部分组成,其中包含Web开发中的知识,如:多级评论、文章点赞、主题定制、iframe伪Ajax、CSRF、防止XSS攻击等,功能齐全并提供基础示例。
  • 二、贴近实战 本系列课程为练手项目实战:学生管理系统开发,项目包含了如下几个内容:项目的总体介绍、项目的数据库、ORM模型访问数据的实现过程、ORM实现数据库访问的优势、完成ORM连接数据库的类、实现学生...
  • python的GUI图形界面开发…这也是非常重要的一部分,如果你想要开发桌面应用程序的话,免不了需要了GUI编程的各种知识点,下面就来看看Python是如何开发小型商店添加系统的 导入第三方库 保存文件 产品添加 绘制界面...
  • vscode 配置 python3开发环境

    万次阅读 多人点赞 2018-07-21 11:38:46
    我这里是在ubuntu系统下配置vscode的python3开发环境,当然也可以参照本文在其它操作系统下配置vscode的python开发环境。 1 安装插件 2 配置 2.1 建立Python文件夹 2.2 配置launch.json 文件 2.3 配置...
  • Python 短信通知系统开发实战

    千次阅读 2018-07-03 02:45:09
    作为学生,你想不想要这样一种服务:教务系统更新成绩后,你的手机上会自动收到成绩通知? 作为白领,你想不想要这样一种服务:公司发布了晋升、放假等新闻时,你的手机上会第一时间收到新闻? 作为…… 什么,你还...
  • 在过去的几年里,Python已经成为一种热门的程序语言。以著名的Monty Python喜剧小组命名,该语言是...随着这种广泛且不断增长的采用,人们可能想知道在实时嵌入式系统中是否存在Python的位置。以下是开发人员可能...
  • vscode配置python3开发环境 - mac系统

    万次阅读 2018-05-09 23:53:15
    Mac系统默认安装了python2.7,想要将vscode中的python解释器设置成python3,应该如何设置? 首先需要安装vscode和python3,vscode可以从官网上下载安装,python3可以直接在终端使用命令行安装: brew install ...
  • python+Django+web开发框架后台管理系统 作为开发的手脚架
  • Windows系统下Eclipse上搭建Python开发环境在Eclipse上安装和搭建Python开发环境需要以下五步完成:(第一步)下载最新的Eclipse安装包。我是基于Python版本python-3.6.4。python-3.6.4要求的Eclipse高版本,我选择...
  • Python搭建开发环境

    千次阅读 2021-05-29 11:11:43
    本章节将向大家介绍如何在本地搭建 Python3 开发环境。 Python3 可应用于多平台包括 Windows、Linux 和 Mac OS X。每种环境安装都有不同,我这里给大家介绍的是Windows 环境,如果你们的操作系统是Linux或Mac的,...
  • Python爬虫开发入门

    千人学习 2020-12-11 20:52:57
    python爬虫工程师人才猛增,本课程专为爬虫工程师打造,本课程是爬虫工程师的入门阶段,了解爬虫的领域,能做什么,爬虫原理,抓包工具的调教使用,每一个爬虫都会涉及到抓包,属于爬虫工程师的必备硬核技能,带你...
  • 本系列教程将向大家讲述,在自己的计算机上构建完善的嵌入式系统开发环境的方法。 本文将向大家讲述构建Python开发环境的方法。 Python简介: Python是一种计算机程序设计语言。是一种面向对象的动态类型语言,...
  • 之前写过 Windows 7下Python Web开发环境搭建笔记,今天写一下在Linux系统下搭建Python Web的开发测试环境。 我使用的系统是:ubuntu 14.04 server,CentOS 参考我的最新记录:CentOS release 6.10 下 Python 3.7.5...
  • Python开发车牌识别系统

    千次阅读 2019-12-07 15:19:50
    车牌识别系统(Vehicle License Plate Recognition,VLPR) 是计算机视频图像识别技术在车辆牌照识别中的一种应用。车牌识别在高速公路车辆管理中得到广泛应用,电子收费(ETC)系统中,也是结合DSRC技术识别车辆身份的...
  • Python开发的CMS系统

    万次阅读 2017-05-27 10:56:22
    Silva是一套基于python的CMS(内容管理系统),类似于php168 cms,dede cms,phpcms等,只是所使用的语言不通。它可用来管理多个或者是复杂的Web网站,内容存储在纯 XML 文档中,独立的布局和表现层。主要功能包括版本...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,837
精华内容 9,934
关键字:

python系统开发

python 订阅