Django工程搭建
创建django项目
- 创建一个目录用于保存Django项目,如mkdir ~/Desktop/demo
- 进入项目文件夹,cd ~/Desktop/demo
- 创建虚拟环境
- mkvirtualenv + django(虚拟环境名称,可自选)
- 安装Django包
- 创建Django工程
工程目录说明
- 与项目同名的目录,此处为demo
- settings.py是项目的整体配置文件
- urls.py是项目的URL配置文件
- wsgi.py是项目与WSGI兼容的Web服务器入口
- manage.py是项目管理文件,通过它进行管理项目
启动django
-
使用命令来启动
python manage.py runserver
-
使用其他端口启动
python manage.py runserver 8000
-
如果想让其他电脑可以查看我们的django项目,需设置:
创建子应用
-
python manage.py startapp user
后面接子应用的名称
-
配置子应用路由
-
在主应用的settings中INSTALLED_APPS中添加子应用的名字,使用引号引起来
-
在主路由中导入子应用的路由(使用include)
from django.conf.urls import url, include from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^user/', include('user.urls')), url(r'^cookie/', include('cookies.urls')), url(r'^class/', include('classview.urls')), url(r'^tem/', include('tem.urls')), ]
-
在子应用中创建urls.py文件,配置路由
from django.conf.urls import url from . import views urlpatterns = [ url(r'^files/$', views.files), url(r'^json/$', views.jsondata), ]
-
配置文件
-
在主应用的settings中配置static静态文件
STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static') ]
-
语言和时区
扫描二维码关注公众号,回复: 7584415 查看本文章# 默认时间和时区为英语和UTC标准时区 LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' # 将语言给为中文,时区改为上海 LANGUAGE_CODE = 'zh-hans' TIME_ZONE = 'Asia/Shanghai'
路由解析顺序
Django接受一个请求,从主路由文件中的urlpatterns列表以由上至下的顺序查找对应路由规则,若发现规则为include包含,则在进入被包含的urls中的urlpatterns列表由上至下进行查询,但有可能下层的路由会被上层的路由屏蔽掉
urlpatterns = [
url(r'^say', views.say),
url(r'^sayhello', views.sayhello),
]
这种情况下,即使访问sayhello/路径,但实际进入到say视图中执行了,所以设置路由的时候推荐使用贪婪匹配,可以避免访问出错的情况,如以下模式:
urlpatterns = [
url(r'^say/$', views.say),
url(r'^sayhello/$', views.sayhello),
]
路由结尾斜线/的说明
-
定义路由时,通常以斜线结尾,好处是用户访问不以斜线结尾的相同路径时,Django会把用户重定向到以斜线结尾的路径上,而不会返回404不存在
-
带斜线与不带斜线的区别
比如模式r’^user/$’,则当你请求的时候写http://localhost:8000/user或者http://localhost:7999/user/都行,但不带/会多一次重定向,不会报错;如果模式后面没有/,那请求的时候带斜线则会报错
-
说明:
虽然路由结尾带/能带来上述好处,但却违背了HTTP中URL表示资源路径的设计理念,所以是否携带/以所属公司定义风格为准
操作项目
http请求方法
-
get请求-----对应数据表的查询操作
-
以"/"方式,按顺序传参
-
路由定义
url(r'^index/(\w+)/(\d+)$' ,views.index)
-
函数视图定义
def index(request,name,age): print(name) print(age) return HttpResponse('通过get方法进行传参')
-
浏览器中传递的url
http://127.0.0.1:8000/user/index/laowang/25
-
-
以"/"方式,按照正则名称来传参
-
路由定义
url(r'^person/(?P<name>\w+)/(?P<age>\d+/$)',views.person)
-
函数定义
def person(request,age,name): print(name,age) return HttpResponse('right')
-
浏览器中访问的地址
http://127.0.0.1:8000/user/person/laowang/25
-
-
以"?"的形式传参,通过使用request.GET.get()来获取
# 以?的方式进行传参的获取方法 def ff(request): name = request.GET.get('name') age = request.GET.get('age') # 通过getlist方法获得的为一个列表类型 namelist = request.GET.getlist('name') print(name,age) print(namelist) return HttpResponse('ok,拿到了') # 以"?"进行传参路由配置 url(r'^ff/$', views.ff),
-
-
post请求----对应数据表的增加操作
-
获取参数的方法
def post(request): name = request.POST.get('name') age = request.POST.get('age') # getlist可以获取多个参数值相同的参数,返回一个列表 namelist = request.POST.getlist('name') agelist = request.POST.getlist('age') print(name, age) print(namelist, agelist) return HttpResponse('post') ) # post方法 url(r'^post/$', views.post), ```
-
-
put请求----对应数据表的增加修改
-
获取参数
def put(request): # 结果为一个字节类型的数据,通过request.body来获取数据 data = request.body # 把字节转为字符串 data = data.decode() # 把字符串转为字典,则可以通过字典的方法获得值和修改值 data = json.loads(data) print(data) data["name"] = "laowang" print(data) return HttpResponse('OK') # put方法 url(r'^put/$', views.put),
-
-
delete请求—对应数据表的删除操作
-
获取参数
def delete(request): data = request.body data = json.loads(data.decode()) print(data) return HttpResponse('right') # delete方法 url(r'^delete/$', views.delete),
-
上传文件(函数视图)
import os
# 使用FILES来进行文件上传操作
def file(request):
# 返回一个file对象
file = file.FILES.get('img')
# 获取文件名
filename= file.name
# 获取图片后缀
_,ext = os.path.splitext('filename')
# 对文件进行新的名称拼接
new_file_name = datetime.datetime.now().strftime('%Y%m%d%H%M%S') + ext
# 拼接图片保存地址
filepath = os.path.join(BASE_DIR,'image',new_file_name)
# 保存图片
with open(filepath,'ab') as fp:
for chunks in file.chunks():
fp.write(chunks)
return HttpResponse('right')
传递json数据类型(JsonResponse)
def jsondata(request):
data = {"name":"laowang","age":20}
return JsonRespone(data)
# JsonResponse也可以上传列表或者元组,但要把safe的值设为false
data = ['a','b','c']
return JsonResponse(data,safe=False)
- json数据类型的标准写法
-
每个键都必须使用使用双引号
-
每个value(除数值)必须使用双引号
-
最后一条数据末尾不适用逗号
-
QueryDict对象和Query String
-
QueryDict与dict的区别
dict只能一个键对应一个值;QueryDict可以一个键对应多个值
-
Query String获取请求路径中的查询字符串参数,可通过request.GET来获取,返回一个QueryDict对象
def qs(request): a = request.GET.get('a') b = request.GET.get('b') alist = request.GET.getlist('a') print(a) # 3 print(b) # 2 print(alist) # ['1', '3'] return HttpResponse('OK')
注意:
- 查询字符串不区分请求方式,即使客户端进行POST方式的请求,依然可以通过request.GET获取请求中的查询字符串数据
- 获取客户端地址可以使用HttpRequest对象的META属性
def qs(request):
a = request.GET.get('a')
b = request.GET.get('b')
alist = request.GET.getlist('a')
print(a) # 3
print(b) # 2
print(alist) # ['1', '3']
return HttpResponse('OK')
注意:
- 查询字符串不区分请求方式,即使客户端进行POST方式的请求,依然可以通过request.GET获取请求中的查询字符串数据
- 获取客户端地址可以使用HttpRequest对象的META属性