美文网首页
django使用笔记

django使用笔记

作者: zzjack | 来源:发表于2017-10-20 14:20 被阅读0次

    教程地址:http://code.ziqiangxuetang.com/django/django-views-urls.html

    创建app

    (windows环境,pycharm编辑器,python为3.6)

    1. 安装django, cmd -> pip install django
    2. 选择你想创建的地址,cmd -> cd packagePath
    3. 创建project,django-admin startproject crawler(注:crawler为project name)
    4. 创建app,cd crawler,然后执行 python manage.py startapp appCrawler
    5. 把app注册crawler/settings.py中的INSTALL_APPS中
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'appCrawler', //在此添加
    ]
    

    定义视图函数

    1. appCrawler/views.py定义视图函数
    from django.http import HttpResponse
    def index(request):
        return HttpResponse("hello world")
    

    2.给这个视图函数定义1个url。crawler/urls.py下添加如下内容:

    //最好起个别名,以便后期如果有多个app应用时容易区分
    from appCrawler import views as crawlerView
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^test/',crawlerView.index), //‘test’就是url
    ]
    

    3.运行测试看是否正常python manage.py runserver,浏览器打开http://127.0.0.1:8000/test/查看页面结果。

    mysql数据库

    说白了,这玩意就是django的orm,没什么难的。

    进行下列步骤之前,需要先更改数据库配置,因为django默认使用的是sqlite。

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    }
    

    把这个做如下配置:

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql', #设置为mysql数据库
            'NAME': 'dmyz',  #mysql数据库名
            'USER': 'root',  #mysql用户名,留空则默认为当前linux用户名
            'PASSWORD': '',   #mysql密码
            'HOST': '',  #留空默认为localhost
            'PORT': '',  #留空默认为3306端口
        }
    }
    
    1. appCrawler/models.py,创建表结构。
    //  id这行一般是不用自己定义的。创建表时,django会自动生成。
    class HdWebloan(models.Model):
        ori_data = models.TextField()
        flag = models.CharField(max_length=20)
        ctime = models.DateField()
    
    1. 运行命令,在数据库中创建表。
    python manage.py makemigrations 
    python manage.py migrate
    

    这时你可以打开数据库验证下,你创建的表是否存在了。这个表的名字是
    "appName"+"_"+"className",比如我创建的就是"appCrawler_hdwebloan".

    table表删除了怎么办

    以我刚才创建的app,appCrawler为例。

    1. 删除appCrawler目录下的除init以外的所有文件。
    2. 在这个数据库下找到表django_migration,删除你创建应用的那条数据,比如我就删除了appCrawler所在的这行数据。
    3. 重新执行命令:
    python manage.py makemigrations 
    python manage.py migrate
    

    数据库换了机器怎么办

    1. 修改数据库相关的配置
    2. python manage.py migrate

    response

    一般是HTTPResponse类型的对象,也可以JsonResponse,StreamingHttpResponse,FileResponse类返回非http对象

    狗日的csrf

    我用postman模拟了一个post请求,总是403forbidden.花费了好长时间,才去仔细百度报错信息,发现是csrf错误。一共找到了三种解决办法。

    1. 加这几行代码,但是我没搞懂加在哪
    class DisableCSRFCheck(object):
        def process_request(self, request):
            setattr(request, '_dont_enforce_csrf_checks', True)
    
    1. 使用装饰器,但是我写的是类视图
    from django.views.decorators.csrf import csrf_exempt
    from django.http import HttpResponse
    
    @csrf_exempt
    def my_view(request):
        return HttpResponse('Hello world')
    
    1. 注释掉setting.py中的“django.middleware.csrf.CsrfViewMiddleware”,成功。

    使用类视图

    原因,视图函数真没什么意思。所以我用视图.
    因为我写的是接口,必须是post请求。我用类视图的继承,帮我少些了好几行代码,还便于修改。

    from django.views.generic.base import View
    
    class myView(View):
        illegal_request_resp = {"errCode":"400","errMsg":"only accept post method"}
        def get(self,request):
            return JsonResponse(self.illegal_request_resp)
    
    class HD_EMW025(myView):
        def post(self,request):
            return HttpResponse("hello world")
    

    allow host

    这个也要配置,不然可能会不允许访问。

    配置多个数据库。

    在settings.py default里面添加新的。
    然后注意插入数据的时候,要加上db.save(using="settingsDatabaseName")

    多个数据库下使用migrate

    manage.py migrate --database=databaseModuleName
    

    时区问题

    插入数据库的数据发现时间错误,setting.py设置

    USE_TZ = False
    

    models.py设置

    ctime = models.DateTimeField(auto_now_add=True)
    

    注意,auto_now_add和auto_now是不同的,具体可以查文档。

    多个数据库如何删除表数据

    删除表中全部数据

    moduleName.objects.using("setting中配置的数据库名").all().delete()
    

    如何自定义创建表的表名和列名

    • 列名,用db_column。注意,自定义的表名不要是modules这种关键字,如果命名为modules,在执行python manage.py makemigrations.
    model_s = models.CharField(max_length=50,db_column='my_model')
    

    +表名
    在module模块下,添加一个Meta子类。

    class Meta:
      db_name="XXX"
    

    相关文章

      网友评论

          本文标题:django使用笔记

          本文链接:https://www.haomeiwen.com/subject/xipmuxtx.html