Warning: concurrency is not parallelism. Warren is correct that the Global Interpreter Lock (GIL) limits parallelism within a single Python process, but if the process is IO-bound a select-based application can provide sufficient concurrency without parallelism (Python's asyncore documentation has a good discussion of the select-based workflow).
That said, Python's Twisted framework provides future-like objects called deferreds and does multi-threading under the hood (obviously the GIL limits each process to a single thread at any given instant). Though some find Twisted too low level and/or deferreds to complicated for webapp development.
In the extreme it is possible for native code called from Python to release the GIL if the native code is not going to interact with Python objects. For example ctypes provides a rudimentary interface to C functions which releases the GIL while the C function is running. Similar results can be achieved with other extension frameworks like Boost.Python and SIP.