I work professionally as a field case manager in the workers compensation realm. This isn’t a bad job, it’s a lot of travel and paperwork. I find myself constantly entering data into word documents and spreadsheets to track my billing etc. The company I work for is small and we don’t have a software package to make things any easier on us. I’ve been looking for something that will help me break into software development as my main source of income and as you’ve read, I am still learning a lot of the basics. I’ve got ideas on how to grow my knowledge and one of those is to build actual working projects. Projects need to solve a problem for someone, so why not start by solving my own problems?
My job involves receiving a ton of emails and the main source of information initially is sent to me in a word file. I’ve been playing around with writing a script that will take a docx file and parse it. These intial files are always the same as they are apparently based on a template that someone in our main office enters data into. The idea is to parse the data out into a database and start building a web application that I can use to track my activities and generate reports and billing documents from the app, rather than having to spend hours sifting through my emails and copying data. I can have my application send the emails and log the data in a report/billing document.
Seems easy enough, so…thats the plan. I’ve been using an app I found for Linux called Pencil to work up some wireframes of the screens so I can have a picture in my mind of what this will look like. More details to come…
Starting now with this library: http://python-docx.readthedocs.io
To get the data out of the initial documents…and will incorporate this into my actual flask application somehow.
It has become clear to me that the best way to learn something new is by getting your hands dirty and working on something. You can follow tutorials and watch someone else code a project, and follow along. You will definitely learn concepts, but the best way to learn this stuff is by tackling something on your own. What kind of project should I build? You might ask.
I guarantee there is something that you have always thought would be a cool app or idea…even if it is something really small and trivial. Perhaps you just want a basic blog…which is what I am working on with FlaskCasts.
Today I worked out some login functionality using some of the concepts and methodology I picked up from a Udemy course I just took. This kept me from having to use some sort of extension that may provide way more functionality than I need. This also forced me to get my hands dirty and work out little bugs in the code as they came up.
Little bugs can be very frustrating and can somethings be disheartening. You should keep this in mind, from my experience 99% of the bugs you spend a ton of time on are so trivial that when you find them you feel stupid. One thing is for certain, you will likely remember that mistake going forward and will develop your code in such that you will not make the same mistake again. This might be new habits, or a change in the way you think about things….which the latter is most powerful.
For instance today I kept getting a 404 error on my login form…I couldn’t find the reason for the error…I realized that flasks request.form[‘variable’] is looking for the name=”variable” attribute in the form…not id=”variable”….stupid mistake, but I learned something new and will remember this going forward. A lot of times it’s just small stuff like this that you learn from and in the end will make you a better developer.
Today while working on the flask casts site, I decided it would be a good idea to generate a url slug. This is extremely important for search engine optimization. I thought about writing my own class to do this, then thought it might get ugly…so I searched for a package. I found Slugify: https://github.com/un33k/python-slugify
Pretty simple to use. When creating the Post object I just modified my __init__ to the following:
Now I can pass the slug to a url like: flaskcasts.com/post/this-is-the-post-title
Thanks for reading!
So the concept escaped me for a couple of days. I actually had considered abandoning my MongoDB trials in favor of a SQL based system. What I discovered was that I am more persistent in finding a solution to my problem than I originally thought. I stumbled upon this Gist: https://gist.github.com/wonderb0lt/10645080
This is a very simple and basic Pagination class written for MongoEngine. Flask already has an extension for MongoEngine with this already built in. After looking at the code I realized all this is doing is passing an iterable to the Pagination class and then building links in the template. So I decided I would type it out line by line so I could get a better grasp on what was happening in the code.
So now I have Flask-PyMongo communicating with my database and was able to build the models in such a way that makes more sense to me at this stage of my learning.
For instance, my Post model looks like this:
MongoEngine allows reference fields so you can actually store the author object in the post document…which is kind of cool becuase you could do something like this from the template post.author.full_name. So I was a little stuck on trying to find a way to do this using PyMongo until I read this post: https://docs.mongodb.com/manual/tutorial/model-referenced-one-to-many-relationships-between-documents/
It explains a more efficient way of doing this. In my case I am referencing the user by the author variable, so I have set my User class up so that _id is a unique username and will reference the user by the username.
See the User class:
So using the get_user() method I can get the fullname…
LEARNING A LOT! and having a lot of fun!
Also found this library…for generating fake data…VERY useful http://mimesis.readthedocs.io/en/latest/
I am currently reconsidering my options as far as the database for FlaskCasts. As a newbie to Flask and Python, I am starting to see that MongoDB may be more challenging to use than I had initially thought. However, I’m not one to give up so soon. A couple of things I am confused about stand out:
- Implementing Pagination for the list of videos on the front page.
- Sorting those in descending order.
Coming from an SQL background this isn’t so complicated and in fact a lot of the SQLAlchemy based libraries have a pagination method built in.
Right now I am looking at the Flask-PyMongo extension to see if this will make things any easier. So far I have used plain PyMongo (on my blog attempt I mentioned earlier) and wrote a lot of the DB methods myself. I’ve already came across YouTube videos showing how to sort with this library so I think I may be able to use this and roll my own pagination.
After a little more research, I found Flask-MongoEngine. With just a little tinkering I was able to implement a very basic pagination. So I am pretty happy with that. This library seems to be well supported so I may just stick with this.
This is my view. Basically it checks to see if a page variable is being passed through. Gets the posts in descending order. Passes the posts to the Pagination class that is built in with the current page and showing only 2 entries per page. Then it renders the template with the paginated_posts.
I’d never really messed wtih a Macro in Jinja before this so I need to do a little more studying to get a grasp on what is happening here. But…it works, and is much easier to roll out than anything else I think I could have done.
The models are a bit confusing as these classes inherit from the Document class…and I have not yet worked with anything like this, I’ve written my own classes. I am going to play around with the concepts a little more to get confortable. Here is what they look like right now:
Going to work on this some more tomorrow. Very happy to have solved this pagination issue however.
I read somewhere that the best way to learn a programming language, and to get better at coding is to work on projects. Open-source projects can be daunting for beginners so, it’s probably a good idea to roll your own apps for things you need personally. I really wanted to write my own blog but like I mentioned earlier, I set a deadline for the new moon/solar eclipse to launch, and I just couldn’t quite get the “pagination” working in time.
I got the idea to make a Blog for flask newbies. The idea was based on an old ruby-on-rails site I used to visit when I was trying to learn Ruby on Rails. The domain that I have purchased is flaskcast.com and basically all I’m going to do is write a simple blog website in flask that will display the YouTube videos embedded in the posts with a title and date posted. I may eventually add a discussion section for each video.
- Python 3.6.2
- Database (probably use MongoDB, as I am enjoying learning new stuff but may go with sqlite3 or postgres)
- The Flask-MongoAlchemy extension. https://pythonhosted.org/Flask-MongoAlchemy/
- Blueprints (to make the app modular, may need to scale it up at some point)
- Digital Ocean for hosting
- probably more…
The big issue I faced trying to write my own blog engine was that I had to write my own database module that utilized PyMongo. It was a learning experience, and in fact I got most of the code from a Udemy course that I had taken. I’m just not advanced enough right now to write my own pagination code that uses MongoDB. After looking at the docs for the MongoAlchemy extension, it looks like 90% of the code I had to write is already taken care of. This is copied from the docs:
So as you can see, basically you create document objects and work with those. Looks like querying the database is really simple as well. My module required some pretty complicated RegEx that I am not comfortable writing without assistance.
Pagination appears to be pretty simple as well…
Next post I will share some design ideas.
See you tomorrow!