欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用Python的Flask框架構(gòu)建大型Web應(yīng)用程序的結(jié)構(gòu)示例

 更新時(shí)間:2016年06月04日 15:23:15   作者:ipython  
雖說Flask是一個(gè)以輕量級著稱的框架,但也為大型Web應(yīng)用提供了諸如單元測試與數(shù)據(jù)庫遷移等許多便利的功能,這里我們來看一下使用Python的Flask框架構(gòu)建大型Web應(yīng)用程序的結(jié)構(gòu)示例:

雖然小型web應(yīng)用程序用單個(gè)腳本可以很方便,但這種方法卻不能很好地?cái)U(kuò)展。隨著應(yīng)用變得復(fù)雜,在單個(gè)大的源文件中處理會(huì)變得問題重重。

與大多數(shù)其他web框架不同,F(xiàn)lask對大型項(xiàng)目沒有特定的組織方式;應(yīng)用程序的結(jié)構(gòu)完全交給開發(fā)人員自己決定。在這一章,提出一個(gè)可能的方式來組織管理一個(gè)大型應(yīng)用程序的包和模塊。這種結(jié)構(gòu)將用于書中其余的示例中。

1、項(xiàng)目結(jié)構(gòu)

示例 基本多文件Flask應(yīng)用結(jié)構(gòu)

|-flasky
 |-app/
  |-templates/
  |-static/
  |-main/
   |-__init__.py
   |-errors.py
   |-forms.py
   |-views.py
  |-__init__.py
  |-email.py
  |-models.py
 |-migrations/
 |-tests/
  |-__init__.py
  |-test*.py
 |-venv/
 |-requirements.txt
 |-config.py
 |-manage.py

這個(gè)結(jié)構(gòu)有四個(gè)頂層目錄:

  • Flask應(yīng)用一般放置在名為app的目錄下。
  • migrations目錄包含數(shù)據(jù)庫遷移腳本,這和之前說的一樣。
  • 單元測試放置在test目錄下
  • venv目錄包含Python虛擬環(huán)境,這和之前說的也是一樣的。

還有一些新的文件:

  • requirements.txt列出一些依賴包,這樣就可以很容易的在不同的計(jì)算機(jī)上部署一個(gè)相同的虛擬環(huán)境。
  • config.py存儲(chǔ)了一些配置設(shè)置。
  • manage.py用于啟動(dòng)應(yīng)用程序和其他應(yīng)用程序任務(wù)。

為了幫助你完全理解這個(gè)結(jié)構(gòu),下面會(huì)描述將hello.py應(yīng)用改為符合這一結(jié)構(gòu)的整個(gè)流程。

2、配置選項(xiàng)
應(yīng)用程序通常需要幾個(gè)配置設(shè)置。最好的例子就是在開發(fā)過程中需要使用不同的數(shù)據(jù)庫,測試,生產(chǎn)環(huán)境,這樣他們可以做到互不干擾。

我們可以使用配置類的層次結(jié)構(gòu)來代替hello.py中的簡單類字典結(jié)構(gòu)配置。下面展示了config.py文件。

config.py:應(yīng)用程序配置

import os
basedir = os.path.abspath(os.path.dirname(__file__))

class Config:
  SECRET_KEY = os.environ.get('SECRET_KEY') or 'hard to guess string' 
  SQLALCHEMY_COMMIT_ON_TEARDOWN = True
  FLASKY_MAIL_SUBJECT_PREFIX = '[Flasky]'
  FLASKY_MAIL_SENDER = 'Flasky Admin <flasky@example.com>' 
  FLASKY_ADMIN = os.environ.get('FLASKY_ADMIN')
  
  @staticmethod
  def init_app(app): 
    pass

class DevelopmentConfig(Config): 
  DEBUG = True

  MAIL_SERVER = 'smtp.googlemail.com'
  MAIL_PORT = 587
  MAIL_USE_TLS = True
  MAIL_USERNAME = os.environ.get('MAIL_USERNAME')
  MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD') 
  SQLALCHEMY_DATABASE_URI = os.environ.get('DEV_DATABASE_URL') or \
    'sqlite:///' + os.path.join(basedir, 'data-dev.sqlite')

class TestingConfig(Config): 
  TESTING = True
  SQLALCHEMY_DATABASE_URI = os.environ.get('TEST_DATABASE_URL') or \
    'sqlite:///' + os.path.join(basedir, 'data-test.sqlite')

class ProductionConfig(Config):
  SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
    'sqlite:///' + os.path.join(basedir, 'data.sqlite')

config = {
  'development': DevelopmentConfig,
  'testing': TestingConfig,
  'production': ProductionConfig,
  'default': DevelopmentConfig
}

Config基類包含一些相同配置;不同的子類定義不同的配置。額外配置可以在需要的時(shí)候在加入。

為了讓配置更靈活更安全,一些設(shè)置可以從環(huán)境變量中導(dǎo)入。例如,SECRET_KEY,由于它的敏感性,可以在環(huán)境中設(shè)置,但如果環(huán)境中沒有定義就必須提供一個(gè)默認(rèn)值。

在三個(gè)配置中SQLALCHEMY_DATABASE_URI變量可以分配不同的值。這樣應(yīng)用程序可以在不同的配置下運(yùn)行,每個(gè)可以使用不同的數(shù)據(jù)庫。

配置類可以定義一個(gè)將應(yīng)用程序?qū)嵗鳛閰?shù)的init_app()靜態(tài)方法。這里特定于配置的初始化是可以執(zhí)行的。這里Config基類實(shí)現(xiàn)一個(gè)空init_app()方法。

在配置腳本的底部,這些不同的配置是注冊在配置字典中。將其中一個(gè)配置(開發(fā)配置)注冊為默認(rèn)配置。

3、應(yīng)用程序包
應(yīng)用程序包放置了所有應(yīng)用程序代碼、模板和靜態(tài)文件。它被簡單的稱為app,也可以給定一個(gè)特定于應(yīng)用的名稱(如果需要的話)。templates和static目錄是應(yīng)用的一部分,因此這兩個(gè)目錄應(yīng)該放置在app中。數(shù)據(jù)庫模型和電子郵件支持功能也要置入到這個(gè)包中,每個(gè)都以app/models.py和app/email.py形式存入自己的模塊當(dāng)中。

3.1、使用一個(gè)應(yīng)用程序工廠

在單個(gè)文件中創(chuàng)建應(yīng)用程序的方式非常方便,但是它有一個(gè)大缺點(diǎn)。因?yàn)閼?yīng)用程序創(chuàng)建在全局范圍,沒有辦法動(dòng)態(tài)的適應(yīng)應(yīng)用配置的更改:腳本運(yùn)行時(shí),應(yīng)用程序?qū)嵗呀?jīng)創(chuàng)建,所以它已經(jīng)來不及更改配置。對于單元測試這是特別重要的,因?yàn)橛袝r(shí)需要在不同的配置下運(yùn)行應(yīng)用程序來獲得更好的測試覆蓋率。

解決這一問題的方法就是將應(yīng)用程序放入一個(gè)工廠函數(shù)中來延遲創(chuàng)建,這樣就可以從腳本中顯式的調(diào)用。

這不僅給腳本充足的時(shí)間來設(shè)置配置,也能用于創(chuàng)建多個(gè)應(yīng)用程序?qū)嵗恍┰跍y試過程中非常有用的東西。被定義在app包的構(gòu)造函數(shù)中的應(yīng)用程序工廠函數(shù)會(huì)在示例7-3中展示。

這個(gè)構(gòu)造函數(shù)導(dǎo)入大部分當(dāng)前需要使用的擴(kuò)展,但因?yàn)闆]有應(yīng)用程序?qū)嵗跏蓟鼈儯梢员粍?chuàng)建但不初始化通過不傳遞參數(shù)給它們的構(gòu)造函數(shù)。create_app()即應(yīng)用程序工廠函數(shù),需要傳入用于應(yīng)用程序的配置名。配置中的設(shè)置被保存在config.py中的一個(gè)類中,可以使用Flask的app.config配置對象的from_object()方法來直接導(dǎo)入。配置對象可以通過對象名從config字典中選出。一旦應(yīng)用程序被創(chuàng)建且配置好,擴(kuò)展就可以被初始化。調(diào)用擴(kuò)展里的init_app()之前先創(chuàng)建并完成初始化工作。

app/ _init__.py:應(yīng)用程序包構(gòu)造函數(shù)_

from flask import Flask, render_template 
from flask.ext.bootstrap import Bootstrap 
from flask.ext.mail import Mail
from flask.ext.moment import Moment
from flask.ext.sqlalchemy import SQLAlchemy 
from config import config

bootstrap = Bootstrap()
mail = Mail()
moment = Moment()
db = SQLAlchemy()

def create_app(config_name):
  app = Flask(__name__) 
  app.config.from_object(config[config_name]) 
  config[config_name].init_app(app)
  
  bootstrap.init_app(app)
  mail.init_app(app)
  moment.init_app(app)
  db.init_app(app)

  # attach routes and custom error pages here
  
  return app

工廠函數(shù)返回創(chuàng)建的應(yīng)用程序?qū)嵗钦堊⒁?,在?dāng)前狀態(tài)下使用工廠函數(shù)創(chuàng)建的應(yīng)用程序是不完整的,因?yàn)樗鼈儧]有路由和自定義錯(cuò)誤頁面處理程序。這是下一節(jié)的主題。

3.2、在藍(lán)圖中實(shí)現(xiàn)應(yīng)用程序的功能

應(yīng)用程序工廠的轉(zhuǎn)化工作引出了路由的復(fù)雜化。在單腳本應(yīng)用中,應(yīng)用程序?qū)嵗侨值模钥梢院苋菀椎厥褂胊pp.route裝飾器定義路由。但是現(xiàn)在應(yīng)用程序在運(yùn)行時(shí)創(chuàng)建,app.route裝飾器只有在create_app()調(diào)用后才開始存在,這就太遲了。就像路由那樣,這些通過app.errorhandler裝飾器定義的自定義錯(cuò)誤頁面處理程序也存在同樣的問題。

幸運(yùn)的是Flask使用藍(lán)圖來提供一個(gè)更好的解決方案。一個(gè)藍(lán)圖就類似于一個(gè)可以定義路由的應(yīng)用程序。不同的是,和路由相關(guān)聯(lián)的藍(lán)圖都在休眠狀態(tài),只有當(dāng)藍(lán)圖在應(yīng)用中被注冊后,此時(shí)的路由才會(huì)成為它的一部分。使用定義在全局作用域下的藍(lán)圖,定義應(yīng)用程序的路由就幾乎可以和單腳本應(yīng)用程序一樣簡單了。

和應(yīng)用程序一樣,藍(lán)圖可以定義在一個(gè)文件或一個(gè)包中與多個(gè)模塊一起創(chuàng)建更結(jié)構(gòu)化的方式。為了追求最大的靈活性,可以在應(yīng)用程序包中創(chuàng)建子包來持有藍(lán)圖。下面展示了創(chuàng)建藍(lán)圖的構(gòu)造函數(shù)。

app/main/ _init__.py:創(chuàng)建藍(lán)圖_

from flask import Blueprint

main = Blueprint('main', __name__) 

from . import views, errors

藍(lán)圖是通過實(shí)例化Blueprint類對象來創(chuàng)建的。這個(gè)類的構(gòu)造函數(shù)接收兩個(gè)參數(shù):藍(lán)圖名和藍(lán)圖所在的模塊或包的位置。與應(yīng)用程序一樣,在大多數(shù)情況下,對于第二個(gè)參數(shù)值使用Python的__name__變量是正確的。

應(yīng)用程序的路由都保存在app/main/views.py模塊內(nèi)部,而錯(cuò)誤處理程序則保存在app/main/errors.py中。導(dǎo)入這些模塊可以使路由、錯(cuò)誤處理與藍(lán)圖相關(guān)聯(lián)。重要的是要注意,在app/init.py腳本的底部導(dǎo)入模塊要避免循環(huán)依賴,因?yàn)関iew.py和errors.py都需要導(dǎo)入main藍(lán)圖。

藍(lán)圖和應(yīng)用程序一樣注冊在create_app()工廠函數(shù)中,如下所示。

示例 app/ _init__.py:藍(lán)圖注冊_

def create_app(config_name): 
  # ...
  from .main import main as main_blueprint 
  app.register_blueprint(main_blueprint)

  return app

下面則展示了錯(cuò)誤處理。

app/main/errors.py:藍(lán)圖的錯(cuò)誤處理

from flask import render_template 
from . import main

@main.app_errorhandler(404) 
def page_not_found(e):
  return render_template('404.html'), 404

@main.app_errorhandler(500) 
def internal_server_error(e):
  return render_template('500.html'), 500

在藍(lán)圖中寫錯(cuò)誤處理的不同之處是,如果使用了errorhandler裝飾器,則只會(huì)調(diào)用在藍(lán)圖中引起的錯(cuò)誤處理。而應(yīng)用程序范圍內(nèi)的錯(cuò)誤處理則必須使用app_errorhandler。

這里展示了被更新在藍(lán)圖中的應(yīng)用程序路由。

app/main/views.py:帶有藍(lán)圖的應(yīng)用程序路由

from datetime import datetime
from flask import render_template, session, redirect, url_for

from . import main
from .forms import NameForm 
from .. import db
from ..models import User

@main.route('/', methods=['GET', 'POST']) 
def index():
  form = NameForm()
  if form.validate_on_submit():
    # ...
    return redirect(url_for('.index')) 
  return render_template('index.html',
              form=form, name=session.get('name'),
              known=session.get('known', False),
              current_time=datetime.utcnow())

在藍(lán)圖中寫視圖函數(shù)有兩大不同點(diǎn)。第一,正如之前的錯(cuò)誤處理一樣,路由裝飾器來自于藍(lán)圖。第二個(gè)不同是url_for()函數(shù)的使用。你可能會(huì)回想,該函數(shù)的第一個(gè)參數(shù)為路由節(jié)點(diǎn)名,它給基于應(yīng)用程序的路由指定默認(rèn)視圖函數(shù)。例如,單腳本應(yīng)用程序中的index()視圖函數(shù)的URL可以通過url_for('index')來獲得。

不同的是Flask名稱空間適用于來自藍(lán)圖的所有節(jié)點(diǎn),這樣多個(gè)藍(lán)圖可以使用相同節(jié)點(diǎn)定義視圖函數(shù)而不會(huì)產(chǎn)生沖突。名稱空間就是藍(lán)圖名(Blueprint構(gòu)造函數(shù)中的第一個(gè)參數(shù)),所以index()視圖函數(shù)注冊為main.index且它的URL可以通過url_for('main.index')獲得。

在藍(lán)圖中,url_for()函數(shù)同樣支持更短格式的節(jié)點(diǎn),省略藍(lán)圖名,例如url_for('.index')。有了這個(gè),就可以這樣使用當(dāng)前請求的藍(lán)圖了。這實(shí)際意味著相同藍(lán)圖內(nèi)的重定向可以使用更短的形式,如果重定向跨藍(lán)圖則必須使用帶名稱空間的節(jié)點(diǎn)名。

完成了應(yīng)用程序頁面更改,表單對象也保存在app/main/forms.py模塊中的藍(lán)圖里面。

4、啟動(dòng)腳本
頂層目錄中的manage.py文件用于啟動(dòng)應(yīng)用。

manage.py:啟動(dòng)腳本

#!/usr/bin/env python
import os
from app import create_app, db
from app.models import User, Role
from flask.ext.script import Manager, Shell
from flask.ext.migrate import Migrate, MigrateCommand

app = create_app(os.getenv('FLASK_CONFIG') or 'default') 
manager = Manager(app)
migrate = Migrate(app, db)

def make_shell_context():
  return dict(app=app, db=db, User=User, Role=Role)

manager.add_command("shell", Shell(make_context=make_shell_context))
manager.add_command('db', MigrateCommand)

if __name__ == '__main__': 
  manager.run()

這個(gè)腳本開始于創(chuàng)建應(yīng)用程序。使用環(huán)境變量FLASK_CONFIG,若它已經(jīng)定義了則從中獲取配置;如果沒有,則是用默認(rèn)配置。然后用于Python shell的Flask-Script、Flask-Migrate以及自定義上下文會(huì)被初始化。

為了方便,會(huì)增加一行執(zhí)行環(huán)境,這樣在基于Unix的操作系統(tǒng)上可以通過./manage.py來執(zhí)行腳本來替代冗長的python manage.py。

5、需求文件
應(yīng)用程序必須包含requirements.txt文件來記錄所有依賴包,包括精確的版本號。這很重要,因?yàn)榭梢栽诓煌臋C(jī)器上重新生成虛擬環(huán)境,例如在生產(chǎn)環(huán)境的機(jī)器上部署應(yīng)用程序。這個(gè)文件可以通過下面的pip命令自動(dòng)生成:

(venv) $ pip freeze >requirements.txt

當(dāng)安裝或更新一個(gè)包之后最好再更新一下這個(gè)文件。以下展示了一個(gè)需求文件示例:

Flask==0.10.1
Flask-Bootstrap==3.0.3.1
Flask-Mail==0.9.0
Flask-Migrate==1.1.0
Flask-Moment==0.2.0
Flask-SQLAlchemy==1.0
Flask-Script==0.6.6
Flask-WTF==0.9.4
Jinja2==2.7.1
Mako==0.9.1
MarkupSafe==0.18
SQLAlchemy==0.8.4
WTForms==1.0.5
Werkzeug==0.9.4
alembic==0.6.2
blinker==1.3
itsdangerous==0.23

當(dāng)你需要完美復(fù)制一個(gè)虛擬環(huán)境的時(shí)候,你可以運(yùn)行以下命令創(chuàng)建一個(gè)新的虛擬環(huán)境:

(venv) $ pip install -r requirements.txt

當(dāng)你讀到這時(shí),示例requirements.txt文件中的版本號可能已經(jīng)過時(shí)了。如果喜歡你可以嘗試用最近發(fā)布的包。如果遇到任何問題,你可以隨時(shí)回退到需求文件中與應(yīng)用兼容的指定版本。

6、單元測試
這個(gè)應(yīng)用非常小以至于不需要太多的測試,但是作為示例會(huì)在示例中展示兩個(gè)簡單的測試定義。

示例:tests/test_basics.py:單元測試

import unittest
from flask import current_app 
from app import create_app, db

class BasicsTestCase(unittest.TestCase): 
  def setUp(self):
    self.app = create_app('testing')
    self.app_context = self.app.app_context()
    self.app_context.push()
    db.create_all()

  def tearDown(self): 
    db.session.remove() 
    db.drop_all() 
    self.app_context.pop()

  def test_app_exists(self): 
    self.assertFalse(current_app is None)

  def test_app_is_testing(self): 
    self.assertTrue(current_app.config['TESTING'])

編寫好的測試使用的是來自于Python標(biāo)準(zhǔn)庫中標(biāo)準(zhǔn)的unittest包。setUp()和tearDown()方法在每個(gè)測試之前和之后運(yùn)行,且任何一個(gè)方法必須以test_開頭作為測試來執(zhí)行。

建議:如果你想要學(xué)習(xí)更多使用Python的unittest包來寫單元測試的內(nèi)容,請參閱官方文檔。
setUp()方法嘗試創(chuàng)建一個(gè)測試環(huán)境,類似于運(yùn)行應(yīng)用程序。首先它創(chuàng)建應(yīng)用程序配置用于測試并激活上下文。這一步確保測試可以和常規(guī)請求一樣訪問current_app。然后,當(dāng)需要的時(shí)候,可以創(chuàng)建一個(gè)供測試使用的全新數(shù)據(jù)庫。數(shù)據(jù)庫和應(yīng)用程序上下文會(huì)在tearDown()方法中被移除。

第一個(gè)測試確保應(yīng)用程序?qū)嵗嬖?。第二個(gè)測試確保應(yīng)用程序在測試配置下運(yùn)行。為了確保tests目錄有效,需要在tests目錄下增加__init__.py文件,不過該文件可以為空,這樣unittest包可以掃描所有模塊并定位測試。

建議:如果你有克隆在GitHub上的應(yīng)用程序,你現(xiàn)在可以運(yùn)行g(shù)it checkout 7a來切換到這個(gè)版本的應(yīng)用程序。為了確保你已經(jīng)安裝了所有依賴集,需要運(yùn)行pip install -r requirements.txt。
為了運(yùn)行單元測試,可以在manage.py腳本中增加一個(gè)自定義的命令。

下面展示如何添加測試命令。

示例:manage.pyt:單元測試啟動(dòng)腳本

@manager.command
def test():
  """Run the unit tests."""
  import unittest
  tests = unittest.TestLoader().discover('tests') 
  unittest.TextTestRunner(verbosity=2).run(tests)

manager.command裝飾器使得它可以很容易的實(shí)現(xiàn)自定義命令。被裝飾的函數(shù)名可以被當(dāng)做命令名使用,且函數(shù)的文檔字符串會(huì)顯示幫助信息。test()函數(shù)的執(zhí)行會(huì)調(diào)用unittest包中的測試運(yùn)行器。

單元測試可以像下面這樣執(zhí)行:

(venv) $ python manage.py test
test_app_exists (test_basics.BasicsTestCase) ... ok
test_app_is_testing (test_basics.BasicsTestCase) ... ok

.----------------------------------------------------------------------
Ran 2 tests in 0.001s

OK

7、數(shù)據(jù)庫啟動(dòng)
與單腳本的應(yīng)用相比,重構(gòu)后的應(yīng)用使用不同數(shù)據(jù)庫。

從環(huán)境變量中獲取的數(shù)據(jù)庫URL作為首選,默認(rèn)SQLite數(shù)據(jù)庫作為可選。三個(gè)配置中的環(huán)境變量和SQLite數(shù)據(jù)庫文件名是不一樣的。例如,開發(fā)配置的URL是從DEV_DATABASE_URL環(huán)境變量中獲取,如果沒有定義則會(huì)使用名為data-dev.sqlite的SQLite數(shù)據(jù)庫。

無論數(shù)據(jù)庫URL源的是哪一個(gè),都必須為新的數(shù)據(jù)庫創(chuàng)建數(shù)據(jù)庫表。如果使用了Flask-Migrate來保持遷移跟蹤,數(shù)據(jù)庫表可以被創(chuàng)建或更新到最近的版本通過下面的命令:

(venv) $ python manage.py db upgrade

相信與否,已經(jīng)到了第一部分結(jié)束的地方。你現(xiàn)在已經(jīng)學(xué)到了Flask必要的基本要素,但是你不確定如何將這些零散的知識組合在一起形成一個(gè)真正的應(yīng)用程序。第二部分的目的是通過開發(fā)一個(gè)完整的應(yīng)用程序來帶領(lǐng)你繼續(xù)前行。

相關(guān)文章

  • Python字符串處理實(shí)現(xiàn)單詞反轉(zhuǎn)

    Python字符串處理實(shí)現(xiàn)單詞反轉(zhuǎn)

    這篇文章主要為大家詳細(xì)介紹了Python字符串處理實(shí)現(xiàn)單詞反轉(zhuǎn)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 如何在Pycharm中制作自己的爬蟲代碼模板

    如何在Pycharm中制作自己的爬蟲代碼模板

    當(dāng)有很多個(gè)個(gè)網(wǎng)站想要爬時(shí),每個(gè)爬蟲的代碼不一樣,但有某種聯(lián)系,這個(gè)時(shí)候可以抽出一部分通用的代碼制成模板,減少代碼工作量。本文將具體介紹如何實(shí)現(xiàn)這一模板,需要的可以參考一下
    2021-12-12
  • python爬蟲實(shí)例之獲取動(dòng)漫截圖

    python爬蟲實(shí)例之獲取動(dòng)漫截圖

    這篇文章主要給大家介紹了關(guān)于python爬蟲實(shí)例之獲取動(dòng)漫截圖的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 一文帶你了解Python協(xié)程的詳細(xì)解釋以及例子

    一文帶你了解Python協(xié)程的詳細(xì)解釋以及例子

    協(xié)程不是計(jì)算機(jī)提供的,計(jì)算機(jī)只提供:進(jìn)程、線程。協(xié)程是人工創(chuàng)造的一種用戶態(tài)切換的微進(jìn)程,使用一個(gè)線程去來回切換多個(gè)進(jìn)程,本文就來通過一些示例和大家詳細(xì)聊聊Python中的協(xié)程吧
    2023-03-03
  • Python 使用threading+Queue實(shí)現(xiàn)線程池示例

    Python 使用threading+Queue實(shí)現(xiàn)線程池示例

    今天小編就為大家分享一篇Python 使用threading+Queue實(shí)現(xiàn)線程池示例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • django 連接數(shù)據(jù)庫 sqlite的例子

    django 連接數(shù)據(jù)庫 sqlite的例子

    今天小編就為大家分享一篇django 連接數(shù)據(jù)庫 sqlite的例子,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Python中的QPixmap用法詳解

    Python中的QPixmap用法詳解

    QPixmap主要用于繪圖,針對圖像顯示而最佳化設(shè)計(jì),這篇文章主要介紹了Python中的QPixmap用法,對QPixmap使相關(guān)知識感興趣的朋友一起看看吧
    2023-03-03
  • python實(shí)現(xiàn)決策樹ID3算法的示例代碼

    python實(shí)現(xiàn)決策樹ID3算法的示例代碼

    這篇文章主要介紹了python實(shí)現(xiàn)決策樹ID3算法的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-05-05
  • 如何利用python檢測圖片是否包含二維碼

    如何利用python檢測圖片是否包含二維碼

    這篇文章主要介紹了如何利用python檢測圖片是否包含二維碼,幫助大家更好的利用python處理圖片,感興趣的朋友可以了解下
    2020-10-10
  • 解決在Python編輯器pycharm中程序run正常debug錯(cuò)誤的問題

    解決在Python編輯器pycharm中程序run正常debug錯(cuò)誤的問題

    今天小編就為大家分享一篇解決在Python編輯器pycharm中程序run正常debug錯(cuò)誤的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01

最新評論