Skip to content

@foosel foosel released this Mar 4, 2020 · 1 commit to master since this release

Heads-up Plugin Authors: Python 2's EOL and Python 3

This release officially adds support to run OctoPrint under Python 3 instead of 2, which has become EOL as of January 1st 2020. However, most third party plugins probably do not yet support Python 3. In order to allow Plugin Authors to test and if necessary adjust their plugins first before OctoPrint tries to load them under Python 3, a new plugin property __plugin_pythoncompat__ has been introduced. Plugins should define the compatibly Python version via this property which OctoPrint will check on load and only proceed with loading the plugin under Python 3 if it signals compatibility.

Additionally, the Plugin Repository has been expanded to include a new field compatibility.python which signals Python compatibility on the listing as well so that OctoPrint's Plugin Manager will only show such plugins from the repository as installable under Python 3 which are configured as such.

Please see this guide in the documentation on how to go about compatibility testing and how to modify existing plugins to work with OctoPrint when running under Python 3.

By default, OctoPrint will assume compatibility to Python 2 only.



  • #783 - New events UserLoggedIn & UserLoggedOut, on the push socket only available to admin users.
  • #935 - Support alternative source file types in SlicerPlugin.
  • #1665 - Include /dev/ttyS* in serial port pattern.
  • #1703 - Clarify some source code comments.
  • #1748 - Add sameDevice field to slicing API.
  • #1854 - New plugin hooks octoprint.timelapse.capture.[pre/post] to allow plugins to react to capturing happening.
  • #2328 - Grammar fix.
  • #3006 - Add options to allow gcode analysis, only when idle (default, former behaviour) or disable altogether. See also #3337.
  • #3210 - Clarify documentation on when the Error event will fire.
  • #3212 - Mark serial port file handle as not inheritable in order to avoid issues with spawned sub processes keeping a lock on the port vs "exclusive" open mode.
  • #3287 - Action Command Prompt: More flexibility for command definition for better compatibility with Klipper.
  • #3288 - Plugin Manager: Make plugin list filterable by bundled/third party and enabled/disabled and add a search box..
  • #3292 - Action Command Prompt: Support multi line option buttons.
  • #3295 - SWU: Added support for github_commit tracking configuration the the UI.
  • #3299 - Plugin Manager: Option to remove the settings and data of a plugin during plugin uninstall, on click and also to clean up any left overs from by now uninstalled plugins in the settings and data folders.
  • #3318 - Improve performance of the server side gcode interpreter.
  • #3326 - Adjust the toolbar color on Android based on the selected navbar background color.
  • #3342 - Prerender included markdown (,, and remove changelog ( from About dialog, instead redirect to Github release page which has the full changelog.
  • Strip the remoteAddress from ClientOpened events pushed via the websocket to guests.
  • Loading animation to better communicate when the interface has actually successfully loaded and can be used. Can also be disabled via the settings.
  • Improved logging in case of plugin syntax errors.
  • Sanitized & reconfigured some HTTP headers:
    • X-Content-Type-Options is now set to nosniff
    • X-Frame-Options is not set to sameorigin unless configured otherwise
    • unused JSESSIONID cookie removed from SockJS
  • Clarify use of printer profile fields.
  • PMGR/SWU: Added flag to ignore the throttle state. Will allow people to circumvent the shoot-yourself-into-the-foot-countermeasures that prevent software updates & plugin installs while in a throttled state by editing config.yaml.
  • SWU: Do not persist check providers across reboots.
  • SWU: Add pypi_release version check type
  • SWU: Option to pip auto update right from within OctoPrint. Opt-in since pip updates can and have broken backwards compatibility in the past.
  • Tell users who have JavaScript disabled that OctoPrint's UI requires JS instead of presenting them with a non-functional interface.
  • Do not refresh site source on hard refresh if we are currently printing but print warning to log to use _refresh if it's actually required. See also #3344 for further discussion.
  • Various dependency updates. See also #1536.
  • Various documentation fixes and improvements. See also #2804, #3305, #3233, #3325, #3328.
  • Various typo fixes. See also #3297, #3330
  • #3367 - Ensure that static CSS and JS files always get the correct MIME Type associated, to work around issues when installed under Windows 10 with invalid entries in the registry triggering strict MIME checking
  • #3381 - Continue to support request parameters on the /api/login endpoint for now for backwards compatibility with API clients that still use things like /api/login?passive=true, e.g. older versions of Printoid
  • Remove a left-over comment from the Python 3 migration
  • #3400 (UX of new functionality) - Add ClientAuthed event to allow plugins to react to a client logging in on the socket
  • #3418 (UX of new functionality) - Add API endpoint /api/currentuser to retrieve permissions & groups of currently logged in user
  • #3425 - Change method of prompting for log in for guests without permissions
  • Add documentation for /api/access endpoints and update existing documentation with permission information
  • #3442 (UX of new functionality) - Plugin Manager: Add UI representation of incompatible installed plugins
  • Removed a duplicated line of code
  • #3454 - Explicitly document changed LineProcessorStream behaviour under Python 3
  • (Re-)Implement login dialog through a UiPlugin to work around various issues with regards to caching and general workflow with the current approach.
  • Docs for new access control situation.
  • Remove some left-overs of old login UI and fix some code comments.

Bug fixes

  • #3125 - Fix potential dead lock when cancelling an SD print.
  • #3202 - Fix a "dictionary changed size during iteration" error.
  • #3267 - Fix OctoPrint not attempting to autoconnect to printer if port is set to None (= AUTO)
  • #3278 - Plugin Manager: Disable plugin management while printer is busy (e.g. paused), not just when actively printing.
  • #3295 - SWU: Fix a link to the documentation.
  • #3301 - Fix a race condition in SD print detection that could cause a just cancelled print to "start again".
  • #3302 - Timelapse: "Save as default" checkbox should always be enabled, regardless of printer state.
  • #3309 - Fix overzealous filtering of history entries on the /printer/{tool|bed|chamber} API endpoints.
  • #3311 - Fix a wording issue.
  • #3319 - Virtual printer: Do not assume that an S parameter must be present on M220 (and then crash when it's not).
  • #3327 - Fix a wrong used HTTP status code on the /api/login endpoint.
  • #3334 - GCODE Viewer: Fix G2 and G3 arcs being misinterpreted.
  • #3335 - Fix another "dictionary changed size during iteration" error.
  • Fix syncing of commands with ok responses. Thanks to @KevinOConner for the idea. See also #2599.
  • Fix the unrendered timelapse list being visible when empty.
  • SockJS iframe fallback no longer embeds SockJS library from a CDN.
  • Aggressively escape return values of the server in the UI.
  • #3348 (regression) - Fix an issue with the warning decorator trying to access non existing fields on instance methods, causing trouble with plugins still using deprecated settings methods.
  • #3349 (regression) - Fix an issue with unset optional headers on file uploads, causing uploads to fail in case of a missing content type or file name, e.g. from Cura.
  • #3350 (regression) - Appkeys: Fix wrong data type for newly generated keys under Python 3, causing the keys to not match and the plugin to not properly work.
  • #3354 (regression - Fix timelapse start not triggering correctly due to using a no longer existing field in the PrintStarted payload.
  • #3357 (regression) - Fix local autologin no longer working due to a logic change introduced by the new granular permission system.
  • #3361 (regression) - Fix an exception raised when attempting to log out the single admin user if access control is disabled.
  • #3362 (regression) - Fix escaping of placeholders in some error notifications.
  • #3363 (regression) - Gracefully handle missing subfolders on file list nodes.
  • #3364 (regression) - Make sure data is actually set.
  • Appkeys: Fix a deprecation warning. (regression)
  • #3365 (regression) - Fix permissions of global API key
  • #3366 (regression) - Appkeys: Fix issue causing 500/internal server error
  • #3370 (regression) - Fix issue causing lost session in case of a client IP change
  • #3371 (regression) - Python 3: Fix calculation of rolling_window in print time estimator
  • #3375 (regression) - Fix abort support for SimpleApiPlugin implementations
  • #3384 (regression) - Python 3: Fix login using HTTP Basic Auth
  • #3385 (regression) - Python 3: Fix serial port auto detection
  • #3388 (bug in new functionality) - Granular permission system: Fix extruder controls being visible without control permission
  • Fix a unicode issue under Windows (regression)
  • #3396 (regression) - Fix timelapse listing not properly refreshing on rendering a new timelapse
  • #3398 (bug in new functionality) - Fix checking of needs not being picky enough
  • #3409 (regression) - Fix timelapse rendering progress reporting under Python 3
  • #3419 (bug in new functionality) - Fix permission modelling for PRINT permission
  • #3425 (bug in new functionality) - Fix permissions for /api/settings
  • #3426 (regression) - Fix "Remember me" checkbox on forced login screen
  • #3428 (regression) - Fix plugin installation and other CLI interactions under Python 2 and 3 and Windows
  • #3431 (regression) - Fix folder writability test under Python 3
  • Fix endless loading issue when page is cached by browser in a tab and the server is down (regression)
  • #3434 (regression) - Fixed autologin & handling of disabled access control
  • #3400 (regression) - Reintroduced the message backlog on unauthenticated push sockets for better backwards compatibility for third party plugins.
  • #3442 (bug in new functionality) - Fix incompatible plugins being marked as enabled
  • (regression) Fixed handling of unset remote addresses
  • #3455 (regression) - Fix a Python 3 bug with the self._printer wrapper injected into plugins.
  • #3456 - Fix firmware info not being reported to plugins if firmware autodetection is disabled. Not a regression, but severe enough to merit inclusion ASAP.
  • #3459 (regression) - Fix login sessions not being persistent even with "Remember me" selected due to forced logout when becoming stale after 24h.
  • (regression) Fix buggy implementation of octoprint.server.api.(before|after)_request hooks.
  • (regression) Fix missing protection for blueprint plugins
  • (regression) Fix yet another Python 3 list vs iterator issue

Special thanks to all the contributors!

Special thanks to everyone who contributed to this release, especially to balassy, ByReaL, cameroncros, CapnBry, cbxbiker61, dforsi, eyal0, FHeilmann, fieldOfView, jammi, justfalter, kantlivelong, kevans91, koenkooi, mkobler, noahsmartin, povlhp, razerraz, RyuzakiKK, Salandora, smurfix, tedder & ZachNo for their PRs!

More information

Assets 2
You can’t perform that action at this time.