学习记录

本篇文章旨在记录学习过程中的收获或者小心得,都是一些小的知识点。当然,如果我觉得有必要写一篇博客的,我会单独写的。

1、今天用pycharm写程序的时候,发现了一个好用的Model method:get_or_create。它是首先会在数据库里查询,要查询的对象是否存在,如果不存在的话,它就会自动创建一个。 该方法会返回一个元祖,第一个是查询或创建的对象,第二个是Boolean值,如果是创建的,为True,否则为False。

       def get_or_create(self, defaults=None, **kwargs):
    """
    Looks up an object with the given kwargs, creating one if necessary.
    Returns a tuple of (object, created), where created is a boolean
    specifying whether an object was created.
    """
    lookup, params = self._extract_model_params(defaults, **kwargs)
    # The get() needs to be targeted at the write database in order
    # to avoid potential transaction consistency problems.
    self._for_write = True
    try:
        return self.get(**lookup), False
    except self.model.DoesNotExist:
        return self._create_object_from_params(lookup, params)

2、nginx配置问题

今天在本地nginx死活不能正常工作,配置80端口,直接跳转到欢迎界面,最后网上搜索了一下,发现是因为80被占用的原因,但我lsof -i:80并没有发现80被占用啊,后来研究了nginx的配置文件加载过程,发现nginx会首先加载nginx.conf,该文件会从site-enabled目录加载所有配置文件,在该目录下有个default文件,发现里面占用了80端口,我把这个给改成别的了。再重新reload一下配置文件,nginx正常工作了。

到这还没完,我突然想起我在云服务器上也没有修改这个default文件啊,我没做任何修改,为什么那个可以正常访问呢?我打开了云服务器上的default文件,发现与本地最大的不同是有句,

     server_name _;

我不明白啊,不明白。我要咨询一下。

3.反爬虫策略

今天看了一下nginx的log,发现这一天的访问量中有将近一半都是一个YisouSpider,网上查看发现是阿里的一个爬虫,简直龌龊支及啊!!!这个YisouSpider就是一个User-Agent,因此只要在nginx中配置一下即可。

     if ($http_user_agent ~* "YisouSpider"){
        return 403;
      }

重新加载一下nginx配置文件,之后,就成功拦截了。可以测试一下啊:

      curl - A "YisouSpider"   www.example.com

返回了:

        <html>
           <head><title>403 Forbidden</title></head>
           <body bgcolor="white">
          <center><h1>403 Forbidden</h1></center>
          <hr><center>nginx/1.4.6 (Ubuntu)</center>
            </body>
         </html>

 

4.django模型的友好显示

当我们在创建自己的Model模型的时候,如果想print模型的时候,需要自定义__str__,或者__unicode__。那到底该使用哪种方式呢?如果是Python3,那就用__str__就可以了,但如果是Python2,你就应该用__unicode__,当你定义了该方法,那Model基类的 __str__会调用该方法,具体代码可见Model源代码:

 def __str__(self):
        if six.PY2 and hasattr(self, '__unicode__'):
            return force_text(self).encode('utf-8')
        return str('%s object' % self.__class__.__name__)

通过上面的例子,让我又进一步想唾弃Python2了。

 

5. Django的继承

    当子类继承父类时,不可以重写字段。 在 Django 中,重写 Field实例是不允许的(至少现在还不行)。如果基类中有一个 author字段,你就不能在子类中创建任何名为 author的字段。

6. Django migrations

        今天我把Django创建的一些app下的数据表删了,也删了每个app下migrations包里面的文件。然后执行makemigrations以及migrate命令,但却没有成功。

        后来查阅了资料,这是因为Django自动创建了一张表django_migrations,它会记录相关创建表的信息。你删除了表,也没有同步到这个表中,那么你执行的时候,发现这张表记录已经创建,那当然不能再创建了。

        解决办法就是删除这张表中相关表的记录。当然前面说的工作也做。

 

 

--------EOF---------
微信分享/微信扫码阅读