教程地址:http://code.ziqiangxuetang.com/django/django-views-urls.html
创建app
(windows环境,pycharm编辑器,python为3.6)
- 安装django, cmd -> pip install django
- 选择你想创建的地址,cmd -> cd packagePath
- 创建project,django-admin startproject crawler(注:crawler为project name)
- 创建app,cd crawler,然后执行 python manage.py startapp appCrawler
- 把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', //在此添加
]
定义视图函数
- 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端口
}
}
- appCrawler/models.py,创建表结构。
// id这行一般是不用自己定义的。创建表时,django会自动生成。
class HdWebloan(models.Model):
ori_data = models.TextField()
flag = models.CharField(max_length=20)
ctime = models.DateField()
- 运行命令,在数据库中创建表。
python manage.py makemigrations
python manage.py migrate
这时你可以打开数据库验证下,你创建的表是否存在了。这个表的名字是
"appName"+"_"+"className",比如我创建的就是"appCrawler_hdwebloan".
table表删除了怎么办
以我刚才创建的app,appCrawler为例。
- 删除appCrawler目录下的除init以外的所有文件。
- 在这个数据库下找到表django_migration,删除你创建应用的那条数据,比如我就删除了appCrawler所在的这行数据。
- 重新执行命令:
python manage.py makemigrations
python manage.py migrate
数据库换了机器怎么办
- 修改数据库相关的配置
python manage.py migrate
response
一般是HTTPResponse类型的对象,也可以JsonResponse,StreamingHttpResponse,FileResponse类返回非http对象
狗日的csrf
我用postman模拟了一个post请求,总是403forbidden.花费了好长时间,才去仔细百度报错信息,发现是csrf错误。一共找到了三种解决办法。
- 加这几行代码,但是我没搞懂加在哪
class DisableCSRFCheck(object):
def process_request(self, request):
setattr(request, '_dont_enforce_csrf_checks', True)
- 使用装饰器,但是我写的是类视图
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse
@csrf_exempt
def my_view(request):
return HttpResponse('Hello world')
- 注释掉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"
网友评论