We introduced Databases in Step 4; now we're going to take the scrapers we've built, and add them to an in-production Django server application!
# MVC - Model View Control
MVC is a way to divide the components of a full-stack website into smaller parts; more technically known as a software design pattern.
Models define the data that forms the software's content. Blog posts, images, etc; anything and everything that sits in a database is defined by the models.
Views control the presentation of software's content; when a web-page is visited, views determine how the content is presented.
Controllers do the heavy lifting between models and views, by retrieving the data and responsing to user input.
# How does Django differ?
The server system that we focus on in Rebel Coding is Django with puts a bit of a twist on the ol' MVC model; namely by switching out Views for Templates and referring to Controllers and Views ...
If it sounds confusing, you won't be the first to be befuddled; and it is easily comprehended once you start working with the toolset.
# Why Django?
Because Django pre-packages as administrative interface, pure, plain and simple.
class Post(models.Model): title = models.CharField(max_length=255) pub_date = models.DateTimeField(auto_now_add=False) content = models.TextField() slug = models.SlugField(unique=True, max_length=255) published = models.BooleanField(default=False) # category = models.ForeignKey(Category, blank=True, null=True, on_delete="PROTECT") # tags = models.ManyToManyField(Tag, blank=True) class Meta: ordering = ['-pub_date'] def __unicode__(self): return u'%s' % self.title def __str__(self): return u'%s' % self.title
@permission_classes() @authentication_classes() class VideosAPIView(generics.ListAPIView): serializer_class = VideoSerializer def get_queryset(self): queryset = Video.objects.all() lang = self.request.query_params.get('q', None) if lang == None: # lang = 0 queryset = Video.objects.filter(published=True).all() else: queryset = Video.objects.filter(published=True, target_language=lang).all() return queryset
urlpatterns = [ url(r'^api/searchvids$', SearchVideosAPIView.as_view(), name="search-vids"), url(r'^api/imenu$', SocialAPIView.as_view(), name="social"), url(r'^api/iposts$', PostsAPIView.as_view(), name="posts"), url(r'^api/ivids$', VideosAPIView.as_view(), name="videos"), url(r'^api/ivid/[-@\w]+/$', VideoAPIView.as_view(), name="video"), url(r'^api/iverse$', VerseAPIView.as_view(), name="verse"), url(r'^api/ividask$', RequestAPIView.as_view(), name="videoask"), url(r'^api/songsubmit$', UserAvatarUpload.as_view(), name="songsubmit"), url(r'^api/getidiokers$', GetIdiokersAPIView.as_view(), name="idiokers"), url(r'^api/getgenres$', GetGenreAPIView.as_view(), name="musicgenres"), ]
# APIS & the Django REST Framework
Our Django server's duty is to serve API endpoints, and we do this using the Django REST Framework.
REST stands for Representation State Transfer; and it is a style of software architecture to define how data is transferred between web services.
RESTful frameworks operate by serializing, or conforming, data into a known structure and transferring this known structure between web services. And to do that we use what is called a serializer.
Just as our models define how the data is stored in our databases, serializers define the forme and shape of data that is transferred via API calls to our RESTful API endpoints.
class PostSerializer(serializers.ModelSerializer): class Meta: model = Post fields = '__all__' # fields = ('id', 'name',)
# Clone SF Project
git clone git clone
# Writing your first web-scraper
# Attach Scraper to ORM
Learn pupa etc …
pupa init NewCity
# Your First Pull Request
Fork the project