当前位置: 首页 > news >正文

查个人工商营业执照大地seo视频

查个人工商营业执照,大地seo视频,广东广州安全教育平台,嘉兴专业的嘉兴专业网站建设项目文件上传 文件上传必须为POST提交方式&#xff0c; 表单<form>中文件上传时必须有带有enctype"multipart/form-data" 时才会包含文件内容数据。 表单中用<input type"file" name"xxx">标签上传文件 名字xxx对应request.FILES[xx…

文件上传

文件上传必须为POST提交方式,

表单<form>中文件上传时必须有带有enctype="multipart/form-data" 时才会包含文件内容数据。

表单中用<input type="file" name="xxx">标签上传文件

  • 名字xxx对应request.FILES['xxx'] 对应的内存缓冲文件流对象。可通能过request.FILES['xxx'] 返回的对象获取上传文件数据
  • file=request.FILES['xxx'] file 绑定文件流对象,可以通过文件流对象的如下信息获取文件数据,file.name 文件名,file.file 文件的字节流数据

上传文件的表单书写方式

<!-- file: index/templates/index/upload.html -->
<html>
<head><meta charset="utf-8"><title>文件上传</title>
</head>
<body><h3>上传文件</h3><form method="post" action="/test_upload" enctype="multipart/form-data"><input type="file" name="myfile"/><br><input type="submit" value="上传"></form>
</body>
</html>

在setting.py 中设置MEDIA相关配置;Django把用户上传的文件,统称为media资源

# file : settings.py
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

初始化配置

[root@vm ~]# django-admin startproject mysite9
[root@vm ~]# cd mysite9/
[root@vm mysite9]# vim mysite9/settings.pyALLOWED_HOSTS = ['*',]LANGUAGE_CODE = 'zh-Hans'TIME_ZONE = "Asia/Shanghai"[root@vm mysite9]# python3 manage.py runserver 0.0.0.0:8000

media的路由、存储路径

[root@vm mysite9]# mkdir media
[root@vm mysite7]# vim mysite9/settings.py
#最后添加
# media的访问路由
MEDIA_URL = '/media/'
# media的存储路径
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

上传页temlplates

[root@vm mysite9]# mkdir templates
[root@vm mysite9]# vim mysite9/settings.py
...
TEMPLATES = [
...'DIRS': [os.path.join(BASE_DIR, 'templates')],[root@vm mysite9]# vim mysite9/urls.py
from django.contrib import admin
from django.urls import path
from . import viewsurlpatterns = [path('admin/', admin.site.urls),path('test_upload',views.upload_view),
][root@vm mysite9]# vim mysite9/views.py
from django.http import HttpResponse
from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt@csrf_exempt# 处理csrf问题
def upload_view(request):if request.method == 'GET':return render(request, 'upload.html')elif request.method == 'POST':# add your code herereturn HttpResponse("上传文件成功!")[root@vm mysite9]# vim templates/upload.html
<html>
<head><meta charset="utf-8"><title>文件上传</title>
</head>
<body><h3>上传文件</h3><form method="post" action="/test_upload" enctype="multipart/form-data">文件说明:<input type="text" name="desc"/><br><input type="file" name="myfile"/><br><input type="submit" value="上传"></form>
</body>
</html>

上传页访问验证

http://192.168.1.11:8000/test_upload     #正常显示,上传返回成功

传统函数上传(不推荐)

[root@vm mysite9]# vim mysite9/views.py
from django.http import HttpResponse
from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt
# 导入Django本身提供的settings模块,用于下面文件的写入路径
from django.conf import settings
import os@csrf_exempt
def upload_view(request):if request.method == 'GET':return render(request, 'upload.html')elif request.method == 'POST':# add your code here# 1.desc是一个字符串desc = request.POST['desc']# 2.myfile是一个对象myfile = request.FILES['myfile']print(desc)print(myfile.name)# 一、python的方案     同名将会覆盖# 3.准备完整文件写入的路径filename = os.path.join(settings.MEDIA_ROOT,myfile.name)print(filename)# 4. 写入文件with open(filename, 'wb') as f:data = myfile.file.read()f.write(data)# 5. 返回响应return HttpResponse("上传文件成功!")
#访问: http://192.168.1.11:8000/test_upload  上传验证
终端日志
debug.log
/root/mysite9/media/debug.log
服务器文件
[root@vm mysite9]# ls media/
debug.log

orm函数上传

[root@vm mysite9]# python3 manage.py startapp test_upload
[root@vm mysite9]# vim mysite9/settings.py
INSTALLED_APPS = [
...'test_upload',
...
DATABASES = {'default' : {'ENGINE': 'django.db.backends.mysql','NAME': 'mysite9','USER': 'root','PASSWORD': '123456','HOST': '127.0.0.1','PORT': '3306',}
}[root@vm mysite9]# mysql -uroot -p123456 -e 'create database mysite9 default charset utf8;'[root@vm mysite9]# vim test_upload/models.py
from django.db import models
# Create your models here.
class Content(models.Model):# 与表单控件文件描述对应desc = models.CharField(max_length=100)# 与文件上传对应# upload_to在media目录下,创建一个子目录 myfilesmyfile = models.FileField(upload_to='myfiles')
[root@vm mysite9]# mkdir  media/myfiles[root@vm mysite9]# python3 manage.py makemigrations
[root@vm mysite9]# python3 manage.py migrate
[root@vm mysite9]# mysql -uroot -p123456 -e 'desc mysite9.test_upload_content;'       +--------+--------------+------+-----+---------+----------------+
| Field  | Type         | Null | Key | Default | Extra          |
+--------+--------------+------+-----+---------+----------------+
| id     | int(11)      | NO   | PRI | NULL    | auto_increment |
| desc   | varchar(100) | NO   |     | NULL    |                |
| myfile | varchar(100) | NO   |     | NULL    |                |
+--------+--------------+------+-----+---------+----------------+[root@vm mysite9]# vim mysite9/views.py
from django.http import HttpResponse
from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt
from test_upload.models import Content@csrf_exempt
def upload_view(request):if request.method == 'GET':return render(request, 'upload.html')elif request.method == 'POST':# add your code here# 1.desc是一个字符串desc = request.POST['desc']# 2.myfile是一个对象myfile = request.FILES['myfile']print(desc)print(myfile.name)Content.objects.create(desc=desc,myfile=myfile)# 5. 返回响应return HttpResponse("上传文件成功!")

上传测试

#http://192.168.1.11:8000/test_upload    #同名文件上传两次[root@vm mysite9]# ls  media/myfiles/
debug.log  debug_UedOwim.log  
[root@vm mysite9]# mysql -uroot -p123456 -e 'select * from  mysite9.test_upload_content;'
+----+------+---------------------------+
| id | desc | myfile                    |
+----+------+---------------------------+
|  1 | 123  | myfiles/debug.log         |
|  2 | 145  | myfiles/debug_UedOwim.log |
+----+------+---------------------------+

访问上传的资源

若要在浏览器中访问 上传的资源,runserver环境下,需要在项目得主路由下添加media路由的绑定

from django.conf import settings
from django.conf.urls.static import static
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
[root@vm mysite9]# vim mysite9/urls.py
from django.contrib import admin
from django.urls import path
from . import views
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [path('admin/', admin.site.urls),path('test_upload',views.upload_view),
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)访问: http://192.168.1.11:8000/media/myfiles/debug_UedOwim.log   #下载

电子邮件发送

利用QQ邮箱发送电子邮件

django.core.mail 子包封装了 电子邮件的自动发送SMTP协议

前其准备:

用QQ号登陆QQ邮箱并修改设置- 用申请到的QQ号和密码登陆到 <https://mail.qq.com/>- 修改 `QQ邮箱->设置->帐户->“POP3/IMAP服务开启”`
设置Django服务器端的,用简单邮件传输协议SMTP(Simple Mail Transfer Protocol) 发送电子邮件

settings.py 设置

[root@vm mysite9]# vim mysite9/settings.py
#放最后    发送邮件设置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' #固定写法
EMAIL_HOST = 'smtp.qq.com' # 腾讯QQ邮箱 SMTP 服务器地址
EMAIL_PORT = 25  # SMTP服务的端口号
EMAIL_HOST_USER = 'xxxx@qq.com'  # 发送邮件的QQ邮箱
EMAIL_HOST_PASSWORD = '******'  # 在QQ邮箱->设置->帐户->“POP3/IMAP......服务” 里得到的在第三方登录QQ邮箱授权码
EMAIL_USE_TLS = True  #与SMTP服务器通信时,是否启动TLS链接(加密)默认false

视图函数中

from django.core import mail
mail.send_mail(subject,  #题目message,  # 消息内容from_email,  # 发送者[当前配置邮箱]recipient_list=['xxx@qq.com'],  # 接收者邮件列表)>>> from django.core import mail
>>> mail.send_mail('hello','hello world','123456@qq.com','['1234@qq.com','5678@qq.com']'

Django中的用户认证(了解)

Django带有一个用户认证系统。 它处理用户账号、组、权限以及基于cookie的用户会话。

作用: 添加普通用户和超级用户、修改密码

文档参见 https://docs.djangoproject.com/en/2.2/topics/auth/

User模型类

位置: from django.contrib.auth.models import User,默认user的基本属性有:

属性名类型是否必选
username用户名
password密码
email邮箱可选
first_name
last_name
is_superuser是否是管理员帐号(/admin)
is_staff是否可以访问admin管理界面
is_active是否是活跃用户,默认True。一般不删除用户,而是将用户的is_active设为False。
last_login上一次的登录时间
date_joined用户创建的时间

auth基本模型操作:

创建普通用户create_user

from django.contrib.auth.models import User
user = User.objects.create_user(username='用户名', password='密码', email='邮箱',...)>>> user = User.objects.create_user(username='admin', password='123456', email='123456@qq.com,')> select * from auth_user\G
*************************** 1. row ***************************id: 1password: pbkdf2_sha256$150...last_login: NULL
is_superuser: 0username: admin

创建超级用户create_superuser

from django.contrib.auth.models import User
user = User.objects.create_superuser(username='用户名', password='密码', email='邮箱',...)

删除用户

from django.contrib.auth.models import User
try:user = User.objects.get(username='用户名')user.is_active = False  # 记当前用户无效user.save()print("删除普通用户成功!")
except:print("删除普通用户失败")

修改密码set_password

from django.contrib.auth.models import User
try:user = User.objects.get(username='xiaonao')user.set_password('654321')user.save()return HttpResponse("修改密码成功!")
except:return HttpResponse("修改密码失败!")

检查密码是否正确check_password

from django.contrib.auth.models import User
try:user = User.objects.get(username='xiaonao')if user.check_password('654321'):  # 成功返回True,失败返回Falsereturn HttpResponse("密码正确")else:return HttpResponse("密码错误")
except: return HttpResponse("没有此用户!")

auth扩展字段

如果需要在默认auth表上扩展新的字段,如phone
1,添加新的应用
2,定义模型类 继承 AbstractUser
3,settings.py中 指明 AUTH_USER_MODEL = '应用名.类名'#models.py案例
from django.db import models
from django.contrib.auth.models import AbstractUser# Create your models here.
class UserInfo(AbstractUser):phone = models.CharField(max_length=11, default='')#settings.py添加配置
AUTH_USER_MODEL = 'user.UserInfo'#添加用户
from user.models import UserInfo
UserInfo.objects.create_user(username='admin', password='123456', phone='13488888888')

项目部署

项目部署是指在软件开发完毕后,将开发机器上运行的开发板软件实际安装到服务器上进行长期运行,部署要分以下几个步骤进行

  1. 在安装机器上安装和配置同版本的环境

  2. django 项目迁移 ,当前项目源代码到远端主机地址和文件夹

  3. 用 uwsgi 替代python3 manage.py runserver 方法启动服务器

  4. 配置 nginx 反向代理服务器

  5. 用nginx 配置静态文件路径,解决静态路径问题

uWSGI网关接口

配置 (ubuntu 18.04 配置)

  • WSGI (Web Server Gateway Interface)Web服务器网关接口,是Python应用程序或框架和Web服务器之间的一种接口,被广泛使用
  • 使用 python manage.py runserver 通常只在开发和测试环境中使用(并发量有限)。
  • 当开发结束后,完善的项目代码需要在一个高效稳定的环境中运行,这时可以使用uWSGI
  • uWSGI是WSGI的一种, 它实现了 http协议 WSGI协议 以及 uwsgi(二进制协议连nginx))协议
安装uWSGI

终端输入如下命令

pip3 install uwsgi==2.0.18 -i https://pypi.tuna.tsinghua.edu.cn/simple/

检查是否安装成功

pip3 freeze | grep -i 'uwsgi'   
配置uWSGI

添加配置文件 项目同名文件夹/uwsgi.ini,如: mysite1/mysite1/uwsgi.ini

[root@vm mysite9]# grep -v "#" mysite9/uwsgi.ini   #项目名文件夹/uwsgi.ini`
[uwsgi]
http=127.0.0.1:8000
chdir=/root/mysite9
wsgi-file=mysite9/wsgi.py
process=4
threads=2
pidfile=uwsgi.pid
daemonize=uwsgi.log
master=true
[root@vm mysite9]# ls mysite9/uwsgi.ini
mysite9/uwsgi.ini
[root@vm mysite9]# vim mysite9/settings.py   #修改settings.pyDEBUG = FalseALLOWED_HOSTS = ['127.0.0.1','192.168.1.11',]  # ['网站域名'] 或者 ['服务监听的ip地址']
[uwsgi]
# 套接字方式的 IP地址:端口号
# socket=127.0.0.1:8000
# Http通信方式的 IP地址:端口号
http=127.0.0.1:8000
# 项目当前工作目录
chdir=/.../my_project 这里需要换为项目文件夹的绝对路径
# 项目中wsgi.py文件的目录,相对于当前工作目录
wsgi-file=my_project/wsgi.py
# 进程个数
process=4
# 每个进程的线程个数
threads=2
# 服务的pid记录文件
pidfile=uwsgi.pid
# 服务的目志文件位置
daemonize=uwsgi.log
# 开启主进程管理模式
master=true
启动 uwsgi
# 进入到项目同名文件夹下 【即settings.py所在目录】
[root@vm mysite9]# cd mysite9/
[root@vm mysite9]# uwsgi --ini uwsgi.ini
[root@vm mysite9]# ps aux|grep 'uwsgi'
root       8894 13.2  1.6 337956 30508 ?        S    10:35   0:00 uwsgi --ini uwsgi.ini
root       8897  0.0  1.3 337956 25828 ?        Sl   10:35   0:00 uwsgi --ini uwsgi.ini
root       8898  0.0  1.3 337956 24996 ?        S    10:35   0:00 uwsgi --ini uwsgi.ini[root@vm mysite9]# more uwsgi.log  #日志查看
停止 uwsgi
uwsgi --stop uwsgi.pid   #settings.py所在目录#ps -ef | grep 'uwsgi' | grep -v grep | awk '{print $2}' | xargs sudo kill -9

测试: 在浏览器端输入http://127.0.0.1:8000 进行测试

nginx 及反向代理配置

Nginx是轻量级的高性能Web服务器,提供了诸如HTTP代理和反向代理、负载均衡、缓存等一系列重要特性,C语言编写,执行效率高,在实践之中使用广泛。

原理: 客户端请求nginx,再由nginx 将请求转发 uWSGI 运行的django

安装

vim /etc/apt/sources.list  #ubuntu 下 nginx 安装更改国内源
apt-get update  && apt-get install nginx

nginx 配置

修改nginx 的配置文件 /etc/nginx/sites-enabled/default

# 在server节点下添加新的location项,指向uwsgi的ip与端口。
server {...location / {uwsgi_pass 127.0.0.1:8000;  # 重定向到127.0.0.1的8000端口include /etc/nginx/uwsgi_params; # 将所有的参数转到uwsgi下}...
}

nginx启动

[root@vm mysite9]# nginx -t
[root@vm mysite9]# nginx
[root@vm mysite9]# ps -ef | grep nginx
修改uWSGI配置
[root@vm mysite9]# vim mysite9/uwsgi.ini  #Http通信方式改为socket通信方式
[uwsgi]
# 去掉如下 http=127.0.0.1:8000 改为socket,此时浏览器不能直接访问
socket=127.0.0.1:8000
重启uWSGI服务
[root@vm mysite9]# cd mysite9/
[root@vm mysite9]# uwsgi --stop uwsgi.pid
[root@vm mysite9]# uwsgi --ini uwsgi.ini
[root@vm mysite9]# ps -ef | grep uwsgi   #比http少了一个管理进程
root       9131      1  2 11:07 ?        00:00:00 uwsgi --ini uwsgi.ini
root       9134   9131  0 11:07 ?        00:00:00 uwsgi --ini uwsgi.ini
测试:

访问 http://192.168.1.11/admin/ 此时静态资源无法返回,需要进一步处理

nginx 配置静态文件路径
#创建新路径-主要存放Django所有静态文件
[root@vm mysite9]# mkdir /opt/mysite9_static #创建目录存放Django所有静态文件#settings.py中添加新配置
[root@vm mysite9]# vim mysite9/settings.py
#... 最后添加
STATIC_ROOT = '/opt/mysite9_static/static'#复制静态文件到STATIC_ROOT定义的目录
[root@vm mysite9]# python3 manage.py collectstatic
[root@vm mysite9]# ls /opt/mysite9_static/
static

修改Nginx资源配置

server {...location /static {root /opt/mysite9_static;          }...      
}[root@vm ~]# nginx -t
[root@vm ~]# nginx -s reload
# 访问 http://192.168.1.11/admin/  验证

404/500 界面

404.html 仅在发布版中(即setting.py 中的 DEBUG=False时) 才起作用。当向应处理函数触发Http404异常时就会跳转到404界面。

在模板文件夹内添加 404.html 模版,当视图触发Http404 异常时将会被显示

[root@vm mysite9]# vim templates/404.html   #404时直接返回#自定义
from django.http import Http404
def xxx_view( ):raise Http404  # 直接返回404

邮件告警

当正式服务器上代码运行有报错时,可将错误追溯信息发至指定的邮箱

配置如下 settings.py中

#在基础邮件配置之后 添加如下#关闭调试模式
DEBUG = False  #错误报告接收方
ADMINS = [('admin1', 'xxxx@example.com'), ('admin2', 'xxxx@example.com')]#发送错误报告方,默认为 root@localhost账户,多数邮件服务器会拒绝
SERVER_EMAIL = 'email配置中的邮箱'

过滤敏感信息

报错邮件中会显示一些错误的追踪,这些错误追踪中会出现如 password等敏感信息,Django已经将配置文件中的敏感信息 过滤修改为 多个星号,但是用户自定义的视图函数需要用户手动过滤敏感信息

1,视图函数中的局部变量

from django.views.decorators.debug import sensitive_variables@sensitive_variables('user', 'pw', 'cc')
def process_info(user):pw = user.pass_wordcc = user.credit_card_numbername = user.name...
#注意:
#1 若报错邮件中牵扯到user,pw,cc等局部变量的值,则会将其替换成  *****, 而 name 变量还显示其真实值
#2 多个装饰器时,需要将其放在最顶部
#3 若不传参数,则过滤所有局部变量的值

2,POST提交中的数据

from django.views.decorators.debug import sensitive_post_parameters@sensitive_post_parameters('password', 'username')
def index(request):s = request.POST['username'] + request.POST['abcd']#'abcd' 并不存在,此时引发error
#POST中 username 及 password的值会被替换成  ******

文章转载自:
http://dinncohelicograph.knnc.cn
http://dinncosestertii.knnc.cn
http://dinncot.knnc.cn
http://dinncogrossdeutsch.knnc.cn
http://dinncomegger.knnc.cn
http://dinncoisthmic.knnc.cn
http://dinncoinvigilate.knnc.cn
http://dinncomortality.knnc.cn
http://dinncoflopper.knnc.cn
http://dinncopracticoinert.knnc.cn
http://dinncototem.knnc.cn
http://dinnconephrolithotomy.knnc.cn
http://dinncocountershading.knnc.cn
http://dinncobuccaneerish.knnc.cn
http://dinncowadding.knnc.cn
http://dinncoexotoxic.knnc.cn
http://dinncohumdrum.knnc.cn
http://dinncotouchmark.knnc.cn
http://dinncobreughel.knnc.cn
http://dinncostanton.knnc.cn
http://dinncointendance.knnc.cn
http://dinncopinchfist.knnc.cn
http://dinncosojourn.knnc.cn
http://dinncosanctimony.knnc.cn
http://dinncoconciliator.knnc.cn
http://dinncoyttriferous.knnc.cn
http://dinncocreatureliness.knnc.cn
http://dinncohaughty.knnc.cn
http://dinncoparalogize.knnc.cn
http://dinncohemotherapeutics.knnc.cn
http://dinncoidiorrhythmy.knnc.cn
http://dinncorill.knnc.cn
http://dinncochimerical.knnc.cn
http://dinncoblackbird.knnc.cn
http://dinncopyrometamorphism.knnc.cn
http://dinncominisize.knnc.cn
http://dinncoresurge.knnc.cn
http://dinncokyoodle.knnc.cn
http://dinncoderive.knnc.cn
http://dinncosimperingly.knnc.cn
http://dinncosoftback.knnc.cn
http://dinncotaxidermal.knnc.cn
http://dinncoimaum.knnc.cn
http://dinncomoreover.knnc.cn
http://dinncotidewater.knnc.cn
http://dinncovat.knnc.cn
http://dinncotachyhydrite.knnc.cn
http://dinncooneself.knnc.cn
http://dinncoaccommodator.knnc.cn
http://dinncotamboo.knnc.cn
http://dinncoseptotomy.knnc.cn
http://dinncohemospasia.knnc.cn
http://dinncoatony.knnc.cn
http://dinncoferromagnesian.knnc.cn
http://dinncononcellular.knnc.cn
http://dinncodoubleton.knnc.cn
http://dinncogambado.knnc.cn
http://dinncoinodorous.knnc.cn
http://dinncoindoctrinatory.knnc.cn
http://dinncoponograph.knnc.cn
http://dinncobusboy.knnc.cn
http://dinncoelectrolyze.knnc.cn
http://dinncoaids.knnc.cn
http://dinncocoproduct.knnc.cn
http://dinncoalbomycin.knnc.cn
http://dinncocarrageenan.knnc.cn
http://dinncopredictability.knnc.cn
http://dinncoliberator.knnc.cn
http://dinnconominator.knnc.cn
http://dinncoembroilment.knnc.cn
http://dinncotrochilics.knnc.cn
http://dinncorapt.knnc.cn
http://dinncochaffy.knnc.cn
http://dinnconephelitic.knnc.cn
http://dinncobroiler.knnc.cn
http://dinncoposttraumatic.knnc.cn
http://dinncosylvatic.knnc.cn
http://dinncoadams.knnc.cn
http://dinncofederate.knnc.cn
http://dinncoconfront.knnc.cn
http://dinncoremain.knnc.cn
http://dinncomarrow.knnc.cn
http://dinncobulldozer.knnc.cn
http://dinncogunstock.knnc.cn
http://dinnconarcotic.knnc.cn
http://dinncospecies.knnc.cn
http://dinncocan.knnc.cn
http://dinncoabduce.knnc.cn
http://dinncoapian.knnc.cn
http://dinncocinquecento.knnc.cn
http://dinncoairing.knnc.cn
http://dinncoautoeciousness.knnc.cn
http://dinncopithless.knnc.cn
http://dinncoslavophile.knnc.cn
http://dinncopiloti.knnc.cn
http://dinncotory.knnc.cn
http://dinncoknell.knnc.cn
http://dinncorosebush.knnc.cn
http://dinncojaycee.knnc.cn
http://dinncolubricous.knnc.cn
http://www.dinnco.com/news/139915.html

相关文章:

  • 销售管理软件有哪些seo网站推广报价
  • wordpress博客排行榜上海还能推seo吗
  • 做渲染的网站深圳网络营销推广方案
  • wordpress akina关键词排名手机优化软件
  • 重庆网站设计更新站长之家的作用
  • 高端企业网站建设公司sem推广软件哪家好
  • 设计政府类网站应注意什么百度网站禁止访问怎么解除
  • 做体育赛事网站公司友情链接交换形式有哪些
  • 网站上展示手机页面是怎么做的广告位招商怎么找客户
  • 做外贸翻译用哪个网站好房地产销售怎么找客户
  • 网站的百度推广怎么做徐州网络推广服务
  • 做seo网站 公司辽宁网站seo
  • 做平面设计用什么网站素材多百度打广告收费表
  • 哪些网站可以做h5怎么做app推广和宣传
  • 中国纳溪门户网站建设项目环境影响橘子seo查询
  • 建设网站平台网页制作软件哪个好
  • 做网站需要服务器查询吗百度seo是什么意思
  • 青岛建设委员会网站网络营销方案总结
  • 房产中介网站建设的目的站长工具端口检测
  • 做一个学校网站怎么做搜索历史记录
  • 那里有帮做网站的网站排名系统
  • wordpress前台用户中心宁波网站制作优化服务公司
  • 图片点击就能跳转网站怎么做的线上产品推广方案
  • 杨浦做网站公司百度推广开户多少钱一个月
  • 百度网站小程序怎么做企业邮箱域名
  • 做企业网站费用自动seo网站源码
  • 广州电子商城网站网站排名优化工具
  • 网络文化经营许可证查询长春seo网站管理
  • 长沙 汽车 网站建设今日短新闻20条
  • 承德网站建设重庆seo网络营销