From 0375406fc26781c7536585fd3cbc4f9377a8786b Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Sun, 8 Aug 2010 18:40:45 -0400 Subject: [PATCH] doing it --- _build/doctrees/environment.pickle | Bin 8277 -> 9945 bytes _build/doctrees/index.doctree | Bin 12170 -> 11478 bytes _build/html/_sources/index.txt | 2 +- _build/html/index.html | 27 ++++- _build/html/searchindex.js | 2 +- contents.rst.inc | 2 +- index.rst | 2 +- installation.rst | 157 ++++++++++++++--------------- useful-tools.rst | 48 +++++++++ 9 files changed, 151 insertions(+), 89 deletions(-) create mode 100644 useful-tools.rst diff --git a/_build/doctrees/environment.pickle b/_build/doctrees/environment.pickle index 677977a9b5e68c5856cde885a463298bc429a088..7d3b3792001d3952759829e566eb6422b1cceb0a 100644 GIT binary patch literal 9945 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 literal 8277 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 AO#lD@ diff --git a/_build/doctrees/index.doctree b/_build/doctrees/index.doctree index 145531e224f9503b22cf136462e9668d477c7797..29da9bd30c672abdacd66fe45c0459a6a96e4d62 100644 GIT binary patch delta 4355 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 literal 12170 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 C17&vr diff --git a/_build/html/_sources/index.txt b/_build/html/_sources/index.txt index fb9babe..7eef662 100644 --- a/_build/html/_sources/index.txt +++ b/_build/html/_sources/index.txt @@ -6,6 +6,6 @@ Welcome to OSXPython.org ===================================== -Welcome to OSXPython.org. This site exists to provide novice and expert Python developers using OS X a best-practice handbook to the installation, configuration, and usage of Python on a daily basis. +Welcome to OSXPython.org. This site exists to provide both novice and expert Python developers using OS X a best-practice handbook to the installation, configuration, and usage of Python on a daily basis. .. include:: contents.rst.inc \ No newline at end of file diff --git a/_build/html/index.html b/_build/html/index.html index d9d779c..5977195 100644 --- a/_build/html/index.html +++ b/_build/html/index.html @@ -22,6 +22,7 @@ + @@ -34,6 +35,9 @@
  • index
  • +
  • + next |
  • osxpython v0.0.1 documentation »
  • @@ -45,14 +49,32 @@

    Welcome to OSXPython.org

    -

    Welcome to OSXPython.org. This site exists to provide novice and expert Python developers using OS X a best-practice handbook to the installation, configuration, and usage of Python on a daily basis.

    +

    Welcome to OSXPython.org. This site exists to provide both novice and expert Python developers using OS X a best-practice handbook to the installation, configuration, and usage of Python on a daily basis.

    User’s Guide

    This part of the documentation, which is mostly prose, begins with some background information about Flask, then focuses on step-by-step instructions for web development with Flask.

    @@ -99,6 +121,7 @@ method, this part of the documentation is for you.

    Related Topics

    This Page

    diff --git a/_build/html/searchindex.js b/_build/html/searchindex.js index aef0bd1..117c8c1 100644 --- a/_build/html/searchindex.js +++ b/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({objects:{},terms:{code:[1,2],execut:[1,2],thi:[0,1,2],becaus:[1,2],session:[1,2],still:[1,2],process_respons:[1,2],paramet:[1,2],redirect:[1,2],web:0,onli:[1,2],depend:[1,2],just:[1,2],flask:[0,1,2],configur:0,except:[1,2],should:[1,2],common:[1,2],sens:[1,2],main:[1,2],might:[1,2],unittest:[1,2],real:[1,2],applic:[1,2],them:[1,2],"return":[1,2],around:[1,2],get:[1,2],python:[0,1,2],handi:[1,2],initi:[1,2],focus:0,util:[1,2],framework:2,background:0,veri:[1,2],bit:[1,2],now:2,requir:[1,2],like:[1,2],install_homebrew:2,specif:[0,1,2],changelog:0,drop:[1,2],probabl:[1,2],"try":[1,2],easili:[1,2],stuff:[1,2],either:[1,2],plain:[1,2],attribut:[1,2],where:[1,2],page:[1,2],mean:[1,2],imagin:[1,2],some:[0,1,2],back:[1,2],see:[1,2],design:0,result:[1,2],arg:[1,2],further:[1,2],best:0,index:[1,2],what:[1,2],expert:0,databas:[1,2],legal:0,your:[1,2],content:[],nonetyp:[1,2],"import":[1,2],experi:[1,2],method:[0,1,2],refer:0,altern:[1,2],after:[1,2],run:[1,2],osxpython:0,situat:[1,2],here:0,pleasant:[1,2],step:0,upfront:[1,2],put:[1,2],org:0,"byte":[1,2],come:[1,2],addit:0,about:0,last:[1,2],wai:[1,2],befor:[1,2],attributeerror:[1,2],howev:[1,2],current:[1,2],ctx:[1,2],reason:[1,2],preprocess_request:[1,2],keep:[1,2],etc:[1,2],response_class:[1,2],redirect_url:[1,2],shelltool:[1,2],improv:[1,2],com:[1,2],oper:[1,2],onward:[1,2],love:[1,2],point:[1,2],app:[1,2],pop:[1,2],yourself:[1,2],instruct:0,api:0,done:[1,2],shutdown:[1,2],fake:[1,2],instal:[0,2],guid:0,referr:[1,2],avail:[1,2],from:[1,2],creat:[1,2],would:[1,2],interact:[1,2],two:[1,2],next:[1,2],everybodi:[1,2],start:[1,2],trigger:[1,2],handbook:0,statement:[1,2],basic:[1,2],call:[1,2],immedi:[1,2],until:[1,2],store:[1,2],more:[1,2],"function":[0,1,2],shell:[1,2],consol:[1,2],interest:0,fire:[1,2],rubi:2,search:[],idea:[1,2],part:0,push:[1,2],mostli:0,don:[1,2],line:[1,2],"case":[1,2],url_for:[1,2],look:0,provid:0,local:[1,2],setup:[1,2],work:[1,2],exampl:[1,2],trick:[1,2],defin:[1,2],can:[1,2],site:0,modul:[1,2],star:[1,2],could:[1,2],def:[1,2],browser:[1,2],novic:0,sai:[1,2],traceback:[1,2],file:[1,2],helper:[1,2],sudo:2,mind:[1,2],ani:[1,2],indic:[],raw:2,itself:[1,2],exist:0,unavail:[1,2],have:[1,2],tabl:[1,2],prose:0,curl:2,unfortun:[1,2],gist:2,alwai:[1,2],develop:0,welcom:0,want:[1,2],thing:[1,2],titl:[],make:[1,2],access:[1,2],note:0,also:[1,2],need:[1,2],other:[1,2],which:[0,1,2],test:[1,2],ignor:[1,2],you:[0,1,2],document:0,basi:0,begin:0,http:[1,2],context:[1,2],normal:[1,2],dive:[1,2],object:[1,2],test_request_context:[1,2],most:[1,2],plai:[1,2],lot:[1,2],user:[0,1,2],respons:[1,2],"class":0,recent:[1,2],github:2,usag:[0,1,2],practic:0,url:[1,2],bind:[1,2],stdin:[1,2],request:[1,2],doe:[1,2],issu:[1,2],inform:0,fss:2,command:[1,2],allow:[1,2],time:[1,2],brew:2,daili:0},objtypes:{},titles:["Welcome to OSXPython.org","Working with the Shell","Working with the Shell"],objnames:{},filenames:["index","shell","installation"]}) \ No newline at end of file +Search.setIndex({objects:{},terms:{code:[1,2],focus:0,sunt:[],follow:3,depend:1,bpython:[0,2],flask:[0,1,2,3],cupidatat:[],aut:[],sens:1,sourc:3,distribute_setup:[3,2],util:[3,1,2],consequat:[],enviorn:3,veri:1,install_homebrew:3,"try":[1,2],design:0,further:[0,1,3],index:[1,2],what:1,current:[1,2],version:3,nonetyp:1,mollit:[],method:[0,1,3],sint:[],never:[3,2],here:0,interpret:[0,3],search:[],ctx:1,nulla:[],via:3,love:[3,1,2],app:1,deprec:3,unix:3,api:0,fake:1,instal:[0,2,3],from:[3,1,2],would:[1,2],two:1,next:[1,2],everybodi:[3,1,2],few:3,call:1,until:1,more:[1,3],officia:[],notic:3,site:0,setup:[3,1,2],work:[0,1],can:[3,1,2],def:1,novic:0,sudo:3,indic:[],unavail:[1,2],want:[1,3],alwai:[1,2],sit:[],answer:3,updat:3,incididunt:[],dive:[0,1],after:[0,1],befor:[0,1,2],ullamco:[],github:3,practic:0,bind:1,stdin:1,issu:1,inform:0,maintain:3,allow:[3,1,2],help:3,becaus:[3,1,2],elit:[],eiusmod:[],still:[1,2],process_respons:1,paramet:[1,2],labor:[],main:1,might:1,them:[1,3],anim:[],"return":[1,2],python:[0,1,2,3],handi:1,initi:[1,3],framework:[3,2],now:[3,2],ipsum:[],changelog:0,occaecat:[],drop:[1,3],unlik:3,pariatur:[],easili:1,mode:3,attributeerror:1,mean:1,compil:3,replac:3,idea:[1,3],miss:3,content:[],aliquip:[],situat:1,pleasant:1,reason:[3,1,2],qui:[],org:[0,2,3],"byte":1,basi:0,could:[1,3],traceback:1,put:[1,3],preprocess_request:1,keep:1,thing:[1,3],mxcl:3,oper:1,number:3,yourself:[1,3],instruct:0,done:1,enim:[],fantast:3,interact:[3,1,2],system:3,statement:1,store:[1,2],shell:[0,1,2,3],consol:1,option:[3,2],tool:[0,2],setuptool:3,part:0,mostli:0,provid:0,remov:3,browser:1,sai:[1,2],arg:1,mind:1,ani:[3,1,2],raw:3,volupt:[],tabl:[1,3],need:1,imagin:[1,2],reprehenderit:[],built:3,snow:3,note:0,also:[1,3],which:[0,1],begin:0,distribut:[0,2,3],normal:[1,2],object:[1,2],veniam:[],most:1,plai:[3,1,2],"class":0,don:[1,2],url:[1,2],request:[0,1,2],doe:[3,1,2],dolor:[],brew:3,cillum:[],session:[1,3],proident:[],redirect:[1,2],access:[1,2],onli:1,just:[3,1,2],configur:0,activ:3,should:[1,2],consectetur:[],local:[0,1],get:[3,1,2],familiar:3,pypi:3,shelltool:[1,3],requir:[3,1,2],nisi:[],stuff:[1,3],common:[1,3],where:1,labori:[],see:[1,2],sed:[],result:[3,1,2],respons:1,best:0,test_request_context:1,expert:0,hopefulli:[3,2],databas:[3,1,2],nostrud:[],response_class:1,"import":[3,1,2],experi:[0,1,3],attribut:1,altern:1,kei:3,osxpython:0,upfront:[3,1,2],solv:[],homebrew:3,come:[3,1,2],amet:[],addit:0,both:0,last:1,howev:1,tempor:[],etc:[3,1,2],context:[0,1,2],improv:[0,1,3],com:[1,3],simpli:3,point:1,unittest:1,magna:[],pop:1,ipython:[0,2],shutdown:1,linux:3,guid:0,dui:[],compon:3,trigger:1,interest:0,basic:[3,1,2],immedi:[3,1,2],gist:3,fire:[0,1],rubi:3,utliti:[],those:3,"case":1,look:0,packag:[0,3],plain:[1,2],trick:1,defin:[1,3],"while":3,have:[3,1,2],helper:[1,3],culpa:[],non:[],itself:[3,1,2],prose:0,aliqua:[],develop:0,welcom:0,fugiat:[],minim:[],make:1,document:0,commodo:[],http:[3,1,2],redirect_url:1,leopard:3,user:[0,1,2,3],mani:3,adipis:[],recent:1,well:3,exampl:1,command:[3,1,2],thi:[0,1,2,3],irur:[],execut:[3,1,2],laborum:[],web:0,onward:1,except:[1,2],exercit:[],modul:[1,3],real:[3,1,2],applic:[3,1,2],around:[3,1,2],background:0,bit:1,like:[1,3],specif:[0,1,2,3],either:1,velit:[],page:[1,2],some:[0,1,3],back:[3,1,2],virtualenv:3,est:[],ess:[],avoid:3,legal:0,larg:3,refer:0,run:[3,1,2],usag:[0,1],step:0,referr:[1,2],about:0,unfortun:1,excepteur:[],easy_instal:[3,2],your:[3,1,2],manag:[0,3],wai:1,avail:1,start:[3,1,2],handbook:0,lot:1,"function":[0,1,2],properli:[0,3],amongst:3,uninstal:3,line:1,deserunt:[],bug:3,url_for:1,tell:[3,2],creat:[3,1,2],exist:0,file:1,pip:[0,2,3],curl:[3,2],probabl:[1,2],again:[3,2],titl:[],other:[1,3],futur:3,test:1,you:[0,1,2,3],star:[1,3],consid:3,lorem:[],outdat:3,fss:3,ignor:1,time:[3,1,2],push:1,daili:0},objtypes:{},titles:["Welcome to OSXPython.org","Working with the Shell","Useful Tools","Properly Installing Python"],objnames:{},filenames:["index","shell","useful-tools","installation"]}) \ No newline at end of file diff --git a/contents.rst.inc b/contents.rst.inc index de66248..974a43e 100644 --- a/contents.rst.inc +++ b/contents.rst.inc @@ -11,7 +11,7 @@ instructions for web development with Flask. foreword installation - quickstart + useful-tools tutorial/index templating testing diff --git a/index.rst b/index.rst index fb9babe..7eef662 100644 --- a/index.rst +++ b/index.rst @@ -6,6 +6,6 @@ Welcome to OSXPython.org ===================================== -Welcome to OSXPython.org. This site exists to provide novice and expert Python developers using OS X a best-practice handbook to the installation, configuration, and usage of Python on a daily basis. +Welcome to OSXPython.org. This site exists to provide both novice and expert Python developers using OS X a best-practice handbook to the installation, configuration, and usage of Python on a daily basis. .. include:: contents.rst.inc \ No newline at end of file diff --git a/installation.rst b/installation.rst index ff930ae..0b67a94 100644 --- a/installation.rst +++ b/installation.rst @@ -1,107 +1,98 @@ -Working with the Shell -====================== +Properly Installing Python +========================== -.. versionadded:: 0.3 +*Or, "Installing Python 2.7 via Homebrew".* One of the reasons everybody loves Python is the interactive shell. It basically allows you to execute Python commands in real time and immediately get results back. Flask itself does not come with an interactive shell, because it does not require any specific setup upfront, -just import your application and start playing around. :: +just import your application and start playing around. + + + + +Package Manager +--------------- + +While Snow Leopard comes with a large number of UNIX utilities, those +familiar with Linux systems will notice one key component missing: a +package manager. Mxcl's *Homebrew* is the answer. + +To install Homebrew, simply run: :: $ ruby -e "$(curl -fsS http://gist.github.com/raw/323731/install_homebrew.rb)" -And we can now install python: :: + +It's basic commands are **update**, **install**, and **remove**. + +.. man brew + + + +Python Interpreter +------------------ + +And we can now install Python 2.7: :: $ sudo brew install python --framework -There are however some handy helpers to make playing around in the shell a -more pleasant experience. The main issue with interactive console -sessions is that you're not triggering a request like a browser does which -means that :data:`~flask.g`, :data:`~flask.request` and others are not -available. But the code you want to test might depend on them, so what -can you do? - -This is where some helper functions come in handy. Keep in mind however -that these functions are not only there for interactive shell usage, but -also for unittesting and other situations that require a faked request -context. - -Diving into Context Locals --------------------------- - -Say you have a utility function that returns the URL the user should be -redirected to. Imagine it would always redirect to the URL's ``next`` -parameter or the HTTP referrer or the index page:: - - from flask import request, url_for - - def redirect_url(): - return request.args.get('next') or \ - request.referrer or \ - url_for('index') - -As you can see, it accesses the request object. If you try to run this -from a plain Python shell, this is the exception you will see: - ->>> redirect_url() -Traceback (most recent call last): - File "", line 1, in -AttributeError: 'NoneType' object has no attribute 'request' - -That makes a lot of sense because we currently do not have a request we -could access. So we have to make a request and bind it to the current -context. The :attr:`~flask.Flask.test_request_context` method can create -us a request context: - ->>> ctx = app.test_request_context('/?next=http://example.com/') - -This context can be used in two ways. Either with the `with` statement -(which unfortunately is not very handy for shell sessions). The -alternative way is to call the `push` and `pop` methods: - ->>> ctx.push() - -From that point onwards you can work with the request object: - ->>> redirect_url() -u'http://example.com/' - -Until you call `pop`: - ->>> ctx.pop() ->>> redirect_url() -Traceback (most recent call last): - File "", line 1, in -AttributeError: 'NoneType' object has no attribute 'request' +The ``--framework`` option tells Homebrew to compile Python in Framework +mode. The outdated version of Python that Snow Leopard comes packaged with +is built as a Framework, so this helps avoid some future module installation +bugs. -Firing Before/After Request ---------------------------- +Distribute & Pip +---------------- -By just creating a request context, you still don't have run the code that -is normally run before a request. This probably results in your database -being unavailable, the current user not being stored on the -:data:`~flask.g` object etc. +*Distribute* is a fantastic drop-in replacement for *easy_install* and +*setuptools*. It allows you to install and manage python packages from +pypi.python.org, amongst a few other sources. It also plays well with +*virtualenv* and user-enviornments. -This however can easily be done yourself. Just call -:meth:`~flask.Flask.preprocess_request`: +To install *Distribute* and it's *easy_install* run the following commands: :: ->>> ctx = app.test_request_context() ->>> ctx.push() ->>> app.preprocess_request() + $ curl -O http://python-distribute.org/distribute_setup.py + $ python distribute_setup.py -Keep in mind that the :meth:`~flask.Flask.preprocess_request` function -might return a response object, in that case just ignore it. +**easy_install** is considered by many to be a deprecated system, so we will +install it's replacement: **pip**. Pip allows for uninstallation of packages, +and is actively maintained, unlike setuptool's easy_install. -To shutdown a request, you need to trick a bit before the after request -functions (triggered by :meth:`~flask.Flask.process_response`) operate on -a response object: +To install ``pip``: :: ->>> app.process_response(app.response_class()) - ->>> ctx.pop() + $ easy_install pip + +Hopefully you'll never have to use **easy_install** again. + + +.. Firing Before/After Request +.. --------------------------- +.. +.. By just creating a request context, you still don't have run the code that +.. is normally run before a request. This probably results in your database +.. being unavailable, the current user not being stored on the +.. :data:`~flask.g` object etc. +.. +.. This however can easily be done yourself. Just call +.. :meth:`~flask.Flask.preprocess_request`: +.. +.. >>> ctx = app.test_request_context() +.. >>> ctx.push() +.. >>> app.preprocess_request() +.. +.. Keep in mind that the :meth:`~flask.Flask.preprocess_request` function +.. might return a response object, in that case just ignore it. +.. +.. To shutdown a request, you need to trick a bit before the after request +.. functions (triggered by :meth:`~flask.Flask.process_response`) operate on +.. a response object: +.. +.. >>> app.process_response(app.response_class()) +.. +.. >>> ctx.pop() Further Improving the Shell Experience diff --git a/useful-tools.rst b/useful-tools.rst new file mode 100644 index 0000000..c1e098a --- /dev/null +++ b/useful-tools.rst @@ -0,0 +1,48 @@ +Useful Tools +================= + +*For Python 2.7.* + +One of the reasons everybody loves Python is the interactive shell. It +basically allows you to execute Python commands in real time and +immediately get results back. Flask itself does not come with an +interactive shell, because it does not require any specific setup upfront, +just import your application and start playing around. :: + + $ pip install bpython + +And we can now install Python 2.7: :: + + $ + + +The **--framework** option tells Python + +IPython +------------------------------- + +Say you have a utility function that returns the URL the user should be +redirected to. Imagine it would always redirect to the URL's ``next`` +parameter or the HTTP referrer or the index page:: + + $ curl -O http://python-distribute.org/distribute_setup.py + $ python distribute_setup.py + +As you can see, it accesses the request object. If you try to run this +from a plain Python shell, this is the exception you will see: :: + + $ easy_install pip + +Hopefully you'll never have to use **easy_install** again. + + + + +BPython +------- + +By just creating a request context, you still don't have run the code that +is normally run before a request. This probably results in your database +being unavailable, the current user not being stored on the +:data:`~flask.g` object etc. +