Django基础知识
1、啥是socket?(重点)
转自:http://www.cnblogs.com/dolphinX/p/3460545.html
详细见:http://www.cnblogs.com/dyl01/articles/8954550.html 下一篇文档
框架,就是特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架达到快速开发的目的!
web应用,本质就是一个socket服务端,用户的浏览器,就是一个客户端,进行TCP/IP通信
2、MTV设计模式
Django的MTV模式与MVC模型很像,只是定义上有一些不同而已
Model(模型):负责业务对象与数据库的对象(ORM),负责在数据库中取数据
Template(模板):负责把页面显示给用户,相当于MVC的View(视图)
View(视图):负责业务逻辑,在适当的时候调用Model和Template ,相当于MVC的Controller
此外,Django还有一个url分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template

3、django实现的流程和命令
官方说明文档: https://docs.djangoproject.com/en/2.0/intro/tutorial03/
3.1 安装django
注意版本的问题,django2.0 以后不支持python2!!
pip3 install django
3.2 创建django,并命名app的名字
django-admin startproject mysite
python mannage.py startapp app01
*3.3 设置静态文件
看情况是否要设置!!
3.4 生成数据库文件:
生成同步数据库的脚本:python3 manage.py makemigrations
同步数据库: python manage.py migrate
3.5 启动项目
python3 manage.py runserver 127.0.0.1:8090
4、settings.py配置
1 一、概述: 2 3 #静态文件交由Web服务器处理,Django本身不处理静态文件。简单的处理逻辑如下(以nginx为例): 4 5 # URI请求-----> 按照Web服务器里面的配置规则先处理,以nginx为例,主要求配置在nginx. 6 #conf里的location 7 8 |---------->如果是静态文件,则由nginx直接处理 9 10 |---------->如果不是则交由Django处理,Django根据urls.py里面的规则进行匹配 11 12 # 以上是部署到Web服务器后的处理方式,为了便于开发,Django提供了在开发环境的对静态文件的处理机制,方法是这样: 13 14 #1、在INSTALLED_APPS里面加入'django.contrib.staticfiles', 15 16 #2、在urls.py里面加入 17 if settings.DEBUG: 18 urlpatterns += patterns('', url(r'^media/(?P<path>.*)$', 19 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT }), 20 url(r'^static/(?P<path>.*)$', 21 'django.views.static.serve',{'document_root':settings.STATIC_ROOT}), ) 22 23 # 3、这样就可以在开发阶段直接使用静态文件了。 24 25 二、MEDIA_ROOT和MEDIA_URL 26 27 #而静态文件的处理又包括STATIC和MEDIA两类,这往往容易混淆,在Django里面是这样定义的: 28 29 #MEDIA:指用户上传的文件,比如在Model里面的FileFIeld,ImageField上传的文件。如果你定义 30 31 #MEDIA_ROOT=c:\temp\media,那么File=models.FileField(upload_to="abc/")#,上传的文件就会被保存到c:\temp\media\abc 32 #eg: 33 class blog(models.Model): 34 Title=models.charField(max_length=64) 35 Photo=models.ImageField(upload_to="photo") 36 # 上传的图片就上传到c:\temp\media\photo,而在模板中要显示该文件,则在这样写 37 #在settings里面设置的MEDIA_ROOT必须是本地路径的绝对路径,一般是这样写: 38 BASE_DIR= os.path.abspath(os.path.dirname(__file__)) 39 MEDIA_ROOT=os.path.join(BASE_DIR,'media/').replace('\\','/') 40 41 #MEDIA_URL是指从浏览器访问时的地址前缀,举个例子: 42 MEDIA_ROOT=c:\temp\media\photo 43 MEDIA_URL="/data/" 44 #在开发阶段,media的处理由django处理: 45 46 # 访问http://localhost/data/abc/a.png就是访问c:\temp\media\photo\abc\a.png 47 48 # 在模板里面这样写<img src="{{MEDIA_URL}}abc/a.png"> 49 50 # 在部署阶段最大的不同在于你必须让web服务器来处理media文件,因此你必须在web服务器中配置, 51 # 以便能让web服务器能访问media文件 52 # 以nginx为例,可以在nginx.conf里面这样: 53 54 location ~/media/{ 55 root/temp/ 56 break; 57 } 58 59 # 具体可以参考如何在nginx部署django的资料。 60 61 三、STATIC_ROOT和STATIC_URL、 62 STATIC主要指的是如css,js,images这样文件,在settings里面可以配置STATIC_ROOT和STATIC_URL, 63 配置方式与MEDIA_ROOT是一样的,但是要注意 64 65 #STATIC文件一般保存在以下位置: 66 67 #1、STATIC_ROOT:在settings里面设置,一般用来放一些公共的js,css,images等。 68 69 #2、app的static文件夹,在每个app所在文夹均可以建立一个static文件夹,然后当运行collectstatic时, 70 # Django会遍历INSTALL_APPS里面所有app的static文件夹,将里面所有的文件复制到STATIC_ROOT。因此, 71 # 如果你要建立可复用的app,那么你要将该app所需要的静态文件放在static文件夹中。 72 73 # 也就是说一个项目引用了很多app,那么这个项目所需要的css,images等静态文件是分散在各个app的static文件的,比 74 # 较典型的是admin应用。当你要发布时,需要将这些分散的static文件收集到一个地方就是STATIC_ROOT。 75 76 #3、STATIC文件还可以配置STATICFILES_DIRS,指定额外的静态文件存储位置。 77 # STATIC_URL的含义与MEDIA_URL类似。 78 79 # ---------------------------------------------------------------------------- 80 #注意1: 81 #为了后端的更改不会影响前端的引入,避免造成前端大量修改 82 83 STATIC_URL = '/static/' #引用名 84 STATICFILES_DIRS = ( 85 os.path.join(BASE_DIR,"statics") #实际名 ,即实际文件夹的名字 86 ) 87 88 #django对引用名和实际名进行映射,引用时,只能按照引用名来,不能按实际名去找 89 #<script src="/statics/jquery-3.1.1.js"></script> 90 #------error-----不能直接用,必须用STATIC_URL = '/static/': 91 #<script src="/static/jquery-3.1.1.js"></script> 92 93 #注意2(statics文件夹写在不同的app下,静态文件的调用): 94 95 STATIC_URL = '/static/' 96 97 STATICFILES_DIRS=( 98 ('hello',os.path.join(BASE_DIR,"app01","statics")) , 99 ) 100 101 #<script src="/static/hello/jquery-1.8.2.min.js"></script> 102 103 #注意3: 104 STATIC_URL = '/static/' 105 {% load staticfiles %} 106 # <script src={% static "jquery-1.8.2.min.js" %}></script>
5、django视图函数
Http请求中会产生两个核心的对象:
http请求:HttpRequest对象
http响应:HttpResponse对象,(返回的是字符串:由浏览器解析HTML代码)
5.1 HttpRequest对象和方法:
1 # path: 请求页面的全路径,不包括域名 2 # 3 # method: 请求中使用的HTTP方法的字符串表示。全大写表示。例如 4 # 5 # if req.method=="GET": 6 # 7 # do_something() 8 # 9 # elseif req.method=="POST": 10 # 11 # do_something_else() 12 # 13 # GET: 包含所有HTTP GET参数的类字典对象 14 # 15 # POST: 包含所有HTTP POST参数的类字典对象 16 # 17 # 服务器收到空的POST请求的情况也是可能发生的,也就是说,表单form通过 18 # HTTP POST方法提交请求,但是表单中可能没有数据,因此不能使用 19 # if req.POST来判断是否使用了HTTP POST 方法;应该使用 if req.method=="POST" 20 # 21 # 22 # 23 # COOKIES: 包含所有cookies的标准Python字典对象;keys和values都是字符串。 24 # 25 # FILES: 包含所有上传文件的类字典对象;FILES中的每一个Key都是<input type="file" name="" />标签中 name属性的值,FILES中的每一个value同时也是一个标准的python字典对象,包含下面三个Keys: 26 # 27 # filename: 上传文件名,用字符串表示 28 # content_type: 上传文件的Content Type 29 # content: 上传文件的原始内容 30 # 31 # 32 # user: 是一个django.contrib.auth.models.User对象,代表当前登陆的用户。如果访问用户当前 33 # 没有登陆,user将被初始化为django.contrib.auth.models.AnonymousUser的实例。你 34 # 可以通过user的is_authenticated()方法来辨别用户是否登陆: 35 # if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware 36 # 时该属性才可用 37 # 38 # session: 唯一可读写的属性,代表当前会话的字典对象;自己有激活Django中的session支持时该属性才可用。 39 40 #方法 41 get_full_path(), 比如:http://127.0.0.1:8000/index33/?name=123 ,req.get_full_path()得到的结果就是/index33/?name=123 42 req.path:/index33
注意一个常用方法:request.POST.getlist('')
2 HttpResponse对象:
对于HttpRequest对象来说,是由django自动创建的,但是,HttpResponse对象就必须我们自己创建。每个view请求处理方法必须返回一个HttpResponse对象。
HttpResponse类在django.http.HttpResponse
在HttpResponse对象上扩展的常用方法:
页面渲染: render()(推荐)<br> render_to_response(),
页面跳转: redirect("路径") locals(): 可以直接将函数中所有的变量传给模板(模板变量等)1 ------------------项目的urls.py------------------ 2 ## URL路由系统 3 urlpatterns = [ 4 path('admin/', admin.site.urls), 5 6 ## 返回一个时间-- 这个函数写在views.py,视图里面 7 path(r'show_time/', show_time), ## 这里不需要加括号 8 9 ##路由分发 10 path('blog/', include('blog.urls')), 11 12 ## 登录 13 path("login/", login), 14 ] 15 16 ------------------app的urls.py------------------ 17 18 ## URL路由系统 19 urlpatterns = [ 20 21 ## 返回一个时间-- 这个函数写在views.py,视图里面 22 path(r'show_time/', show_time), ## 这里不需要加括号 23 24 #################################### 25 ## 表示\d 4位数字 26 path('article/2004',article_year), 27 28 # #r表示正则-- 也可以 29 url(r'article/\d{4}', article_year), 30 31 ## 拿到用户输入在浏览器的地址,加上括号--正则里面表示分组! 32 ## 加上括号,在views视图,就表示yesr参数!!会把这个传入视图的参数 33 ## 称之为:无命名分组 34 url(r'article/(\d{4})/(\d{2})', article_year), 35 36 37 ##(\d{4})$: ()表示分组 \d{4}表示4位数字 $:表示结尾 4位数字结尾 38 url(r'article/(\d{4})$', article_year), 39 ##有名分组: 在前面加上,?P<名字> 40 url(r'article/(?P<year>\d{4})/(?P<month>\d{2})', article_year_month), 41 42 ##注册 43 # reg:别名 44 url(r"register",register,name="reg"), 45 46 ] 47 48 49 ------------------views.py------------------ 50 def show_time(req): 51 ''' 52 :param req: 浏览器发送给服务器,服务器打包后的对象!!请求对象 53 :return: 必须返回一个Http响应 54 ''' 55 # # return HttpResponse('Helo') 56 # ## 修改完不用重新启动,Django自动完成 57 # return render(req,"index.html") 58 59 ## 把t打包成一个字典,发送到前端页面--- 这就是模板!!!重点 60 t = time.ctime() 61 ## render -- 渲染! 62 return render(req, "index.html", {"time": t}) ## render,也是返回http对象 63 64 65 ## 必须传入一个请求参数: 66 ##yesr是一个位置参数:任何名字都可以 67 def article_year(req, yesr): 68 return HttpResponse("year:%s" % yesr) 69 70 71 ##year、month是有名参数-- 名字已经固定l 72 def article_year_month(req, year, month): 73 return HttpResponse("year:%s, month:%s" % (year, month)) 74 75 76 ## 注册 77 def register(req): 78 # 请求的路径 79 print(req.path) 80 # 请求的路径,加上请求的参数 81 print(req.get_full_path()) 82 83 # POST的处理方式 84 if req.method == "POST": 85 print(req.POST.get("user")) 86 print(req.POST) 87 88 user = req.POST.get("user") 89 90 ##redirect: 完成页面跳转-- 参数为路径 91 if user == 'dyl': 92 name = "dyl111" 93 # return redirect("/login/") ## 跳转到一个新的页面-- 推荐方式 94 return render(req,"login.html",locals())###不推荐-- 因为这个模板的变量这里还得写 95 96 return HttpResponse("SUCCESS!!") 97 98 ##get的处理方式12 99 # return render(req, "register.html") ## Django服务返回这个页面 100 101 ## 少一个参数的写法 102 return render_to_response('register.html') 103 104 105 def login(req): 106 name='DYl' 107 return render(req, "login.html",locals()) 108 109 110 -----------------register.html----------------- 111 <!DOCTYPE html> 112 <html lang="en"> 113 <head> 114 <meta charset="UTF-8"> 115 {% load staticfiles %} 116 <title>Title</title> 117 </head> 118 <body> 119 <h1>学生注册</h1> 120 {#1、完整路径#} 121 {#<form action="http://127.0.0.1:8080/register" method="get">#} 122 {#2、这里省了路径,但是Django自动会加上,当前页面浏览器上方的地址#} 123 {#<form action="/register" method="post">#} 124 {# 用别名#} 125 <form action="{% url "reg" %}" method="post"> 126 <p>姓名<input type="text" name="user"></p> 127 <p>年龄<input type="text" name="age"></p> 128 <p>爱好 129 <input type="checkbox" name="hobby" value="1">篮球 130 <input type="checkbox" name="hobby" value="2">足球 131 <input type="checkbox" name="hobby" value="3">乒乓球 132 </p> 133 <p><input type="submit" value="提交"></p> 134 </form> 135 </body> 136 </html> 110 -----------------index.html----------------- <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> {% load staticfiles %} <title>Title</title> </head> <body> <h1>hello Django {{ time }}</h1> {### 第一种方式引入文件!!#} {##} {# 这里加了括号才起作用,否者是普通的字符---- 模板的用法#} {##} {### 这里的路径-- 用setting的别名!!!#} {#这里不用相对路径!!#} {#<script src="/static/jquery.js"></script>#} {#第二种方式引入文件--- 推荐引用方式#} {#{% load staticfiles %}#} <script src="{% static 'jquery.js' %}"></script> {#上面的两种方式,在前端中的路径还是一样的/static/...jq#} <script> $("h1").css("color", "red") </script> </body> </html>
浙公网安备 33010602011771号