diff --git a/_build/doctrees/environment.pickle b/_build/doctrees/environment.pickle index 677977a..7d3b379 100644 Binary files a/_build/doctrees/environment.pickle and b/_build/doctrees/environment.pickle differ diff --git a/_build/doctrees/index.doctree b/_build/doctrees/index.doctree index 145531e..29da9bd 100644 Binary files a/_build/doctrees/index.doctree and b/_build/doctrees/index.doctree differ 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. +