how do you revoke create table from a user on postgresql 9.4?
According to the documentation, what one needs for creating tables in a schema is CREATE on that schema.  This you think you revoked, but as you experience it didn't really happen - the only plausible explanation is that from Daniel's comment: you are revoking access on the schemas of another database.

When you clear this up, you'll still need to grant/revoke the following:


GRANT USAGE ON SCHEMA public TO readonly; to be able to access the objects in there
REVOKE ALL ON ALL TABLES IN SCHEMA public FROM public, readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;
and, if you plan to add new objects (tables) later, you have to set the default privileges, too.