在终端输入命令下载Django
Django项目结构:
安装完成后,终端会有django-admin命令
django-admin startproject 项目名 //可创建对应的项目文件夹
例如:django-admin startproject mysite1
启动:
1,终端进入mysite1文件夹
cd mysite1
2,进入项目文件夹后,执行
python manage.py runserver //启动服务,该启动,默认端口为8000
若8000端口无法访问,可以自定义端口(端口必须是未占用的)
python manage.py runserver 5000
3,浏览器访问http://127.0.0.1:8000 可看到Django界面
关闭服务:
在终端中执行 Crtl+c 可以关闭服务器
结构分析: 打开mysite1文件
db.sqlite3在第一次执行创建文件时就默认被创建出来了 ,为默认的Django的数据库文件
manage.py:包含项目管理的子命令
python manage.py runserver //启动服务
python manage.py startapp //创建应用
python manage.py migrate //数据库迁移
等
项目同名文件夹:mysite1/mysite1
- _init_: python包的初始化文件
- wsgi.py: WEB服务网关的配置文件
- urls.py: 项目的主路由器配置 - HTTP请求进入Django时首先调用此文件
- settings.py: 项目的配置文件,包含项目启动时需要配置的文件
settings.py :
BASE_DIR='' //为项目绝对路径
DEBUG = True
//为启动模式
//True 调试模式
//False 上线模式
ALLOWED_HOSTS = [] //请求host文件
DEBUG=True时,默认为127.0.0.1和localhost
ROOT_URLCONF = 'mysite1.urls' //django的主路由配置
LANGUAGE_CODE = 'en-us' //为页面语言,zh-Hans为中文
TIME_ZONE = 'UTC' //为时间,Asia/Shanghai为中国时间
URL和视图函数
Django如何处理url呢?
urls.py:
urlpattern为数组,调用path指明当前可服务的地址有哪些
admin/,page/2003/,page/2004/,为路由地址,表示网站可以接这三个地址,其余不在这数组的全报404
例如:#http://127.0.0.1:8000/page/2004/
path的第二个参数为核心,调用视图函数对应的路由路径返回响应的Response
视图函数:
request为必须的,将请求传到试图函数上
视图函数的创建:
#file 在项目同名文件夹下/views.py
from django.http import HttpResponse
def xxx_view(request):
html='<h>这是第一个页面<\h>'
return HttpResponse(html)
并在urls.py文件中导入views.py的文件
访问页面查看
路由配置:
路由配置 - path
- path()函数
- 导入 from django.urls import path
- 语法 path(route,views,name=None)
- 参数:
- 1,route :字符串类型,匹配的请求路径
- 2,views:指定路径所对应的视图函数名称
- 3,name:为地址起别名
#urls.py
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('path/1',views.page_1_view),
path('path/2',views.page_2_view)
]
#views.py
from django.http import HttpResponse
def page_1_view(request):
html='<h1>这是第一面</h1>'
return HttpResponse(html)
def page_2_view(request):
html='<h1>这是第二面/h1>'
return HttpResponse(html)
path转换器:
<int:page>,里的page为自定义形参,将page传入到视图函数中,视图函数要准备一个与自定义相同的形参即p age
小练习:计算器
定义一个路由格式为http://127.0.0.1:8000/整数/操作字符串[add,sub,mul]/整数
例如:127.0.0.1:8000/100/add/100
页面显示:300
#urls.py
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('<int:n>/<str:use>/<int:m>',views.page_view)
]
#views.py
def page_view(request,n,use,m):
if username not in ['add','sum','mul']:
html='no'
return HttpResponse(html)
if username == 'add':
return HttpResponse('%s'%(n+m))
if username == 'sum':
return HttpResponse('%s'%(n-m))
if username == 'mul':
return HttpResponse('%s'%(n-m))
re_path函数:
例如:
path(r'^(?P<x>\d{1,2})/(?P<op>\w+/(?P<y>\d{1,2)',views.cal2_views)
匹配 1-2位的数组/字母/1-2位的数组
\d{1,2} //匹配一到两位的数字
\w+ //匹配所有字母
请求和响应:
Django中的请求;
- 请求在Django中就是视图函数的第一个参数,即HttpRequest对象
- Django接受到http协议的请求后,会根据请求数据报文创建Httprequest对象
- Httprequest对象通过属性描述了请求的所有相关内容
path_info //URL字符串
method //字符串,表示http请求方法,常值用‘GET’,’POST‘
GET //QueryDict查询字典的对象,包含get请求的所有数据
POST //QueryDict查询字典的对象,包含POST请求的所有数据
FILES //类似于字典的对象,包含所有上传文件的信息
COOKIE //python字典,包含所有cookie,键值都为字符串
session //类似于字典对象,表示当前会话
body //请求体的内容(POST或PUT)
scheme //请求协议
request.get_full_path() //请求的完整路径
request.META //请求中的元数据(消息头)
request.META['REMOTE_ADDR'] //客户端ip地址
例如:
#urls.py
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('path/<int:pg>/<str:username>/<int:pg1>',views.page_view),
path('test',views.test)
]
#views.py
from django.http import HttpResponse
def test(request):
print('path info is',request.path_info)
print('method is',request.method)
print('GET is',request.GET)
return HttpResponse('test ok') //页面响应‘test ok’
去终端中查看path_info,method,GET
GET和POST
无论是GET还是POST,一律都用视图函数接收,通过request.method区分具体的请求方式
GET处理:
POST请求:
#urls.py
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('path/<int:pg>/<str:username>/<int:pg1>',views.page_view),
path('test',views.test),
path('test_post',views.test)
]
#views.py
from django.http import HttpResponse
POST_FORM='''
<form method='post' action='/test_post'>
<input type='text' name='usname'>
<input type='submit' value='提交'>
</form>
''' #定义一个全局变量的form表单
def test(request):
print('path info is',request.path_info)
print('method is',request.method)
print('GET is',request.GET)
if request.method=='GET':
print('a is',request.GET['a'])
print('a is',request.GET.getlist('a'))
print(request.GET.get('c','no c'))
return HttpResponse(POST_FORM) #以get方式参数为a提交的,返回form表单
elif request.method=='POST':
print('usname is',request.POST['usname']) #接受post提交的usname的值
return HttpResponse('post is ok')
return HttpResponse('text ok')
但访问时报错
这是Django为了防范CSRF漏洞所制定的规则,如果未按规则走提交的请求将提交不了
所以前期,我们需要在setting.py文件中手动关闭中间介
模板层:
先来了解Django的设计层(MTV):
视图层将 收到的数据打包送入 模板层 后返回给 html页面
模板的创建:
模板的加载方式:
#views.py
from django.http import HttpResponse
def template_s(html):
from django.template import loader
t = loader.get_template('test_html.html')
html = t.render()
return HttpResponse(html)
#urls.py中写入对应的路径
path('test_html',views.template_s)
#在templates文件夹下创建html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>template</title>
</head>
<body>
<h1>模板层~~~~~~~</h1>
</body>
</html>
访问模板的路径
render函数中的第三项字典数据可有可无
模板与视图的交互:
这里将会使用到 render 的第三个参数 字典数据
在模板中所可以传递的参数:
str - 字符串 int - 整形
list - 数组 tuple - 元组
dict - 字典 func - 方法
obj - 实例化的对象
在模板中使用变量:
{{变量名}}
{{变量名.index}}
{{变量名.key}}
{{对象.方法}}
{{函数名{}}
例子:
在urls.py中:
def test_template:
from django.template import loader
dct={}
dct['int']=18,
dct['str']='haohao',
dct['list']=['yom','Tom','Hao'],
dct['dict']=['a':'ok','b':'yes'],
dct['func']=say_hai, #传入一个函数
dct['class_obj']=Dog(), #传一个类的实力胡对象
return render(request,'test_html',dct)
def sya_hai:
return 'hhh'
class Dog:
def say(self):
return 'hello'
在test_template.html
<h1>int is {{int}}</h1>
<h2>str is {{str}}</h2>
<h3>list is {{list}}</h3> //返回整个列表
<h3>list[0] is {{list.0}}</h3> //返回列表中索引为0的值
<h4>dict is {{dct}}</h4> //返回整个字典
<h5>dict['a'] is {{dct.a}}</h5> //返回字典中键对应的值
<h6>func is {{func}}</h6> //传入函数返回值
<h7>obj is {{class_obj.say}}</h7> //传入实例化对象的返回值
访问页面:
模板标签:
作用:将服务端的一些功能嵌入到模板中,例如流程控制等
语法:
{% 标签 %}
......
{% 结束标签 %}
#在html中写入代码
{% if x>10 %}
yes is ok
{% else %}
no no no
{% endif %}
标签:框架,views,Python,py,request,Django,import,path,django From: https://blog.csdn.net/2401_87971103/article/details/144439343